Hinzufügen von WCF-Dienst in die bestehende Anwendung?
Ich habe eine bestehende Anwendung, welche nun hat die Verpflichtung, mit interagiert werden von einem mobilen Gerät. Das mobile Gerät verfügt über eine wifi-Verbindung, und würde den Anschluss an den PC hosting der Haupt-Anwendung auf einem LAN. Das mobile Gerät muss einfach hinzufügen/Bearbeiten/suchen/löschen von Objekten, die die wichtigste Anwendung ist die Pflege. Die Hauptanwendung bereits kapselt seine Funktionalität in einigen einfachen repository-Klassen.
Ich glaube, der Ansatz wäre es, fügen Sie einen WCF-service zu den wichtigsten Anwendung, die stellt eine Reihe von Methoden des mobilen Geräts aufrufen können gegen. Aber ich habe mir bis WCF heute und versucht, die setup-ein Beispiel für die Anwendung, aber wenn man die WCF-Methoden es ist nicht der Zugriff auf Daten, die als solche empfinde ich den WCF-Dienst ausgeführt wird, in einer eigenen Anwendungsdomäne und als solche hat keinen Zugriff auf die gleiche static-Klassen in der main-Anwendung.
Wenn ich setup ein WCF-Dienst-Projekt in VS 2008/2010, wie kann ich es unter der gleichen Anwendungsdomäne wie die Haupt-WinForms-Anwendung, so dass eine remote-Anwendung auf dem LAN kommunizieren können, um Daten aus der Anwendung.
Unten ist meine Probe WinForm
using System;
using System.ServiceModel;
using System.Windows.Forms;
using DataProject;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public TestDataProject.DataStore Datastore = TestDataProject.DataStore.GetInstance();
public Form1()
{
InitializeComponent();
Datastore.Add(new MyObj { ID = 1, Data = "hello" });
Datastore.Add(new MyObj { ID = 2, Data = "world" });
Datastore.Add(new MyObj { ID = 3, Data = "item3" });
Datastore.Add(new MyObj { ID = 4, Data = "item4" });
Datastore.Add(new MyObj { ID = 5, Data = "fiver" });
}
}
}
Was ich von einem WCF-Dienst ist der Zugang zu TestDataProject.DataStore.GetInstance();
Bearbeiten
Ich erreichte dies durch
using System;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Windows.Forms;
using DataProject;
using TestDataProject;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public TestDataProject.DataStore Datastore = TestDataProject.DataStore.GetInstance();
public Form1()
{
InitializeComponent();
Datastore.Add(new MyObj { ID = 1, Data = "hello" });
Datastore.Add(new MyObj { ID = 2, Data = "world" });
Datastore.Add(new MyObj { ID = 3, Data = "item3" });
Datastore.Add(new MyObj { ID = 4, Data = "item4" });
Datastore.Add(new MyObj { ID = 5, Data = "fiver" });
ServiceHost host = new ServiceHost(typeof(SimpleService),
new Uri("http://localhost:8001/MetadataSample"));
try
{
//Check to see if the service host already has a ServiceMetadataBehavior
ServiceMetadataBehavior smb = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
//If not, add one
if (smb == null)
smb = new ServiceMetadataBehavior();
smb.HttpGetEnabled = true;
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);
//Add MEX endpoint
host.AddServiceEndpoint(
ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexHttpBinding(),
"mex"
);
//Add application endpoint
host.AddServiceEndpoint(typeof(ISimpleService), new WSHttpBinding(), "");
//Open the service host to accept incoming calls
host.Open();
//The service can now be accessed.
Console.WriteLine("The service is ready.");
Console.WriteLine("Press <ENTER> to terminate service.");
Console.WriteLine();
Console.ReadLine();
//Close the ServiceHostBase to shutdown the service.
//host.Close();
}
catch (CommunicationException commProblem)
{
Console.WriteLine("There was a communication problem. " + commProblem.Message);
Console.Read();
}
}
public void Display(string msg)
{
MessageBox.Show(msg);
}
}
[ServiceContract]
public interface ISimpleService
{
[OperationContract]
string Test();
[OperationContract]
string GetOBJDesc(int id);
[OperationContract]
MyObj GetObject(int id);
}
public class SimpleService : ISimpleService
{
#region Implementation of ISimpleService
public string Test()
{
return "Hello world";
}
public string GetOBJDesc(int value)
{
MyObj obj = DataStore.GetInstance().Get(value);
if (obj != null)
{
return obj.Data;
}
return "";
}
public MyObj GetObject(int id)
{
return DataStore.GetInstance().Get(id);
}
#endregion
}
}
Mit app.config mit
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="WindowsFormsApplication1.SimpleService">
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="SimpleServiceBehavior">
<serviceMetadata httpGetEnabled="True" policyVersion="Policy15" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Konnte ich dann mit WCF Test-Client auf die url http://localhost:8001/MetadataSample
Die wichtigste Frage, die ich litt, war mein Dienst automatisch starten kann, dies kann deaktiviert werden, in VS2010 durch eine Projekt-Einstellung. Und das andere Problem war die UAC, da Visual studio nicht festgelegt war, um ein administrator der debugger failed to host a service, wurde dieses Problem behoben, indem ein WindowsFormApplication1.MANIFEST-Datei mit
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">”
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">”
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
- Es klingt wie von "WCF-service" beziehen können, um einen WCF-Dienst läuft im Kontext des IIS / web-server. Ist der WCF-Dienst, den Sie erstellt haben, definitiv laufen innerhalb des windows forms-Prozess?
- Ich glaube nicht, dass es ist, was vielleicht das Problem. Ich habe eine neue WCF-Projekt in visual studio (Datei - > New - > Projekt -> WCF Service Application) In der service-Kontakte, die ich definiert einen Satz von test-Methoden, aber Sie nicht wieder die gleichen Daten wie das Formular enthält. Form hat Zugang zu 5 Objekte in ein repository, sondern auch die "gleiche" repository bereits 0 Objekte für den WCF-Dienst. Das repository ist zugänglich über eine GetInstance um sicherzustellen, dass Sie haben die gleiche Referenz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstellung einer WCF-Web Service-Projekt, die ausgeführt werden, innerhalb der web-service-Prozess (normalerweise IIS), nicht innerhalb Ihres windows forms-Prozess und damit nicht jeder Zugriff auf alle Daten in statische Klassen und Eigenschaften in der Windows Forms-Prozess.
Es klingt wie Ihre einfachste option ist das hosten der WCF-Dienst in Ihrem windows-forms-Anwendung statt. Ich möchte nicht zu sehr ins detail gehen, wie dies zu tun, da gibt es eine Reihe von Ressourcen, die bereits über das Internet verfügbar (auch ich kann kaum behaupten, ein Experte zu sein!), aber möchten Sie vielleicht, um zu versuchen, die folgenden Artikel als Ausgangspunkt:
WCF-Dienste bereitgestellt werden, in der gleichen assembly wie der rest der Anwendung und sollte in der Lage sein, um Zugriff auf alle Kurse in it. Vielleicht haben Sie verwendet einen anderen namespace. Wenn dies der Fall ist, verwenden Sie einen vollqualifizierten Namen oder eine using-Anweisung.