L'ajout de service WCF à l'application existante?

J'ai une application existante qui a maintenant l'obligation d'être en interaction à partir d'un appareil mobile. Le périphérique mobile dispose d'une connexion wi-fi, et serait de la connexion à l'ordinateur hébergeant l'application principale sur un réseau local. Le périphérique mobile doit simplement ajouter/modifier/supprimer des objets de l'application principale est le maintien. L'application principale déjà encapsule ses fonctionnalités en quelques simples classes de dépôt.

Je crois que l'approche serait d'ajouter un service WCF à l'application principale, qui expose un ensemble de méthodes de l'appareil mobile peut appeler contre. Toutefois, j'ai regardé WCF aujourd'hui et a essayé de configuration d'un exemple d'application, mais lorsqu'il est appelé à la WCF méthodes qu'il est incapable d'accéder à des données, en tant que tel, je ressens le service WCF est en cours d'exécution dans son propre domaine d'application et n'a pas accès aux mêmes classes statiques dans l'application principale.

Si je configurer un service WCF projet de VS 2008/2010, comment puis-je exécuter sous le même domaine d'application que la principale application WinForms, de sorte qu'une application à distance sur le réseau local peuvent communiquer avec elle pour obtenir des données à partir de l'application.

Ci-dessous est mon exemple 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" });
        }
    }
}

Ce que j'ai besoin d'un service WCF, est l'accès à TestDataProject.La banque de données.GetInstance();

Modifier

J'ai réalisé cela en

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
}
}

Avec app.config contenant

<?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>

Je pourrais ensuite utiliser Client Test WCF sur l'url http://localhost:8001/MetadataSample

Le principal problème j'ai souffert, a été mon Service de départ automatiquement, cela peut être désactivé dans VS2010 par un projet de création. Et l'autre question était de contrôle de compte d'utilisateur, compte tenu de Visual studio n'était pas d'être un administrateur le débogueur a échoué à l'hôte d'un service, cela a été résolu par l'ajout d'un WindowsFormApplication1.Fichier MANIFEST contenant

<?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>
Il sonne comme par "service WCF" vous pourriez être en se référant à un service web WCF cours d'exécution dans le contexte de IIS / le serveur web. Est à votre service WCF vous avez créé certainement en cours d'exécution à l'intérieur de la windows forms processus?
Je ne pense pas que c'est, peut-être la question. J'ai créé un nouveau WCF projet dans visual studio (Fichier - > New - > Projet -> Service WCF Application) Dans le service de contacts que j'ai défini un ensemble de méthodes d'essai, mais elles ne renvoient pas les mêmes données que le formulaire contient. Formulaire a accès à 5 objets dans un référentiel, mais le "même" référentiel a 0 objets pour le service WCF. Le référentiel est accessible via un GetInstance pour s'assurer qu'ils ont la même référence.

OriginalL'auteur JonWillis | 2011-02-18