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.
InformationsquelleAutor JonWillis | 2011-02-18
Schreibe einen Kommentar