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>
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
Vous devez vous connecter pour publier un commentaire.
Vous avez créé un Service Web WCF projet, qui sera exécuté à l'intérieur du service web de processus (normalement IIS), et non à l'intérieur de votre windows forms processus et donc il n'ont pas accès à toutes les données statiques de classes et de propriétés dans les Windows Forms processus.
Il semble que votre option la plus simple est d'accueillir le service WCF à l'intérieur de votre application windows forms à la place. Je ne veux pas trop entrer dans les détails sur comment faire car il y a un certain nombre de ressources déjà disponibles sur le web (aussi je ne peux pas prétendre être un expert en la matière!), mais vous pourriez vouloir essayer l'article suivant comme point de départ:
Elle na pas de me donner une solution de travail, mais j'ai réussi à mettre quelque chose ensemble, en tenant pièces à partir de ce lien et autres tutoriels. Le terme que j'ai besoin de trouver a été auto-hébergé des services WCF.
OriginalL'auteur Justin
WCF services sont déployés dans la même assemblée que le reste de l'application et doit être en mesure d'accéder à toutes les classes. Peut-être que vous avez utilisé un autre espace de noms. Si c'est le cas, utilisez un nom complet ou à l'aide d'instruction.
OriginalL'auteur kgiannakakis