C# 是否将WCF服务添加到现有应用程序?

C# 是否将WCF服务添加到现有应用程序?,c#,winforms,wcf,windows-mobile,C#,Winforms,Wcf,Windows Mobile,我有一个现有的应用程序,现在需要通过移动设备与之交互。移动设备具有wifi连接,并将连接到LAN上承载主应用程序的PC。移动设备只需添加/编辑/查找/删除主应用程序正在维护的对象。主应用程序已经将其功能封装在一些简单的存储库类中 我相信这种方法将是向主应用程序添加一个WCF服务,它公开了一组移动设备可以调用的方法。然而,我今天查阅了WCF并尝试设置一个示例应用程序,但是当调用WCF方法时,它无法访问任何数据,因此我感觉WCF服务正在其自己的应用程序域中运行,因此无法访问主应用程序中相同的静态类

我有一个现有的应用程序,现在需要通过移动设备与之交互。移动设备具有wifi连接,并将连接到LAN上承载主应用程序的PC。移动设备只需添加/编辑/查找/删除主应用程序正在维护的对象。主应用程序已经将其功能封装在一些简单的存储库类中

我相信这种方法将是向主应用程序添加一个WCF服务,它公开了一组移动设备可以调用的方法。然而,我今天查阅了WCF并尝试设置一个示例应用程序,但是当调用WCF方法时,它无法访问任何数据,因此我感觉WCF服务正在其自己的应用程序域中运行,因此无法访问主应用程序中相同的静态类

如果我在VS 2008/2010中设置了WCF服务项目,如何在与主WinForms应用程序相同的应用程序域下运行它,以便LAN上的远程应用程序可以与其通信以从应用程序获取数据

下面是我的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" });
        }
    }
}
我需要从WCF服务中访问TestDataProject.DataStore.GetInstance()

编辑

我是通过

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
    }
}
使用系统;
使用System.ServiceModel;
使用System.ServiceModel.Description;
使用System.Windows.Forms;
使用数据工程;
使用TestDataProject;
命名空间Windows窗体应用程序1
{
公共部分类Form1:Form
{
public TestDataProject.DataStore DataStore=TestDataProject.DataStore.GetInstance();
公共表格1()
{
初始化组件();
Add(newmyobj{ID=1,Data=“hello”});
Add(newmyobj{ID=2,Data=“world”});
Add(newmyobj{ID=3,Data=“item3”});
Add(newmyobj{ID=4,Data=“item4”});
Add(newmyobj{ID=5,Data=“fiver”});
ServiceHost主机=新的ServiceHost(typeof(SimpleService),
新Uri(“http://localhost:8001/MetadataSample"));
尝试
{
//检查服务主机是否已具有ServiceMetadataBehavior
ServiceMetadataBehavior smb=host.Description.Behaviors.Find();
//如果没有,请添加一个
如果(smb==null)
smb=新的ServiceMetadataBehavior();
smb.HttpGetEnabled=true;
smb.MetadataExporter.PolicyVersion=PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);
//添加MEX端点
host.AddServiceEndpoint(
ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexHttpBinding(),
“墨西哥”
);
//添加应用程序终结点
AddServiceEndpoint(typeof(ISimpleService),新的WSHttpBinding(),“”);
//打开服务主机以接受传入呼叫
host.Open();
//现在可以访问该服务。
WriteLine(“服务准备就绪”);
控制台。WriteLine(“按以终止服务”);
Console.WriteLine();
Console.ReadLine();
//关闭ServiceHostBase以关闭服务。
//host.Close();
}
捕获(通信异常通信问题)
{
Console.WriteLine(“存在通信问题。”+commProblem.Message);
Console.Read();
}
}
公共无效显示(字符串消息)
{
MessageBox.Show(msg);
}
}
[服务合同]
公共接口是简单的服务
{
[经营合同]
字符串测试();
[经营合同]
字符串GetOBJDesc(int-id);
[经营合同]
MyObj-GetObject(int-id);
}
公共类SimpleService:ISimpleService
{
#ISimpleService的区域实现
公共字符串测试()
{
返回“你好世界”;
}
公共字符串GetOBJDesc(int值)
{
MyObj obj=DataStore.GetInstance().Get(值);
如果(obj!=null)
{
返回对象数据;
}
返回“”;
}
公共MyObj GetObject(int-id)
{
返回DataStore.GetInstance().Get(id);
}
#端区
}
}
app.config包含

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

然后我可以在url上使用WCF测试客户端

我遇到的主要问题是我的服务自动启动,这可以通过项目设置在VS2010中禁用。另一个问题是UAC,由于Visual studio未设置为管理员,调试器无法承载服务,因此通过添加包含

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

”
”

WCF服务与应用程序的其余部分部署在同一程序集中,应该能够访问其中的任何类。也许您使用了不同的名称空间。如果是这种情况,请使用完全限定名或using语句。

您已经创建了一个WCF Web服务项目,该项目将在Web服务进程(通常是IIS)中运行,而不是在windows窗体进程中运行,因此它将无法访问windows窗体进程中静态类和属性中的任何数据

听起来最简单的选择是在windows窗体应用程序中托管WCF服务。我不想太详细地讲述如何做到这一点,因为web上已经有很多可用的资源(我也可以)