1

我有一个处理一些数据输入和计费的 winform 应用程序。我想添加一个只能通过本地 LAN 访问的 WCF 服务。我希望我的计费程序查询我的数据库并为客户获取一些数据。重要的是,这在同一程序中完成,而不是创建另一个程序。

我的问题是很难设置这样的 WCF 服务,我从现有的 winform 应用程序开始,而不是创建新的 WCF 服务。正确使用指令是一件简单的事情,还是因为我没有从一开始就将其设置为 WCF 服务而从根本上缺少其他东西?

另一个问题是我需要担心线程还是由 WCF 服务自动处理?例如,如果 10 台计算机同时查询我的 winforms 应用程序,WCF 是否会无缝地处理这个问题,或者我是否需要实现额外的功能来处理这个问题?

谢谢阅读

4

3 回答 3

7

基本上,要创建 WCF 服务,您需要三件事:

  • 用于定义服务提供的方法的服务契约(通常表示为 .NET 接口)。这还包括方法期望(并可能返回)的数据类型

    [ServiceContract(Namespace="http://services.yourcompany.com/Service/2012/08")]
    interface IMyService
    {
       [OperationContract]
       SomeReturnType ThisIsYourMethod(string input, int value, .....);
    }
    
    [DataContract(Namespace="http://data.yourcompany.com/Service/2012/08")]
    public class SomeReturnType
    {
       [DataMember] 
       public string Name { get; set; }
    
       [DataMember]
       public int Age { get; set; }  
    }
    
  • 创建要调用的实际服务代码的服务实现。这只是一个实现服务契约的普通 .NET 类

    public class MyServiceImplementation : IMyService
    {
         SomeReturnType ThisIsYourMethod(string input, int value, .....)
         {
             /// .... do some processing, fetch data etc.
             return ......
         }
     }
    
  • 实际托管 WCF 运行时并启动整个 WCF 处理的服务主机;这是一个ServiceHost能够托管您的服务的实例(或派生类)。此类需要在 Winforms 应用程序的启动过程中的某个位置进行实例化和打开。一旦服务主机打开,您的服务就可以从外部世界调用。当您的 Winforms 应用程序关闭时,您需要确保关闭服务主机。

  • 此外,您可能还需要app.config文件中的一些配置设置来定义您的 WCF 服务向全世界提供的端点(地址、绑定、合同)。

所以这真的很简单——只需在你的 Winform 项目中创建这些项目,你就完成了。

于 2012-08-03T06:36:49.720 回答
4

请看这篇文章Hosting and Consuming WCF Services

托管 WCF ServiceHost 的 Windows 服务(本文中的示例)

using System;
using System.ServiceModel;
using System.ServiceProcess;
using QuickReturns.StockTrading.ExchangeService;

namespace QuickReturns.StockTrading.ExchangeService.Hosts
{
    public partial class ExchangeWindowsService : ServiceBase
    {
        ServiceHost host;

        public ExchangeWindowsService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            Type serviceType = typeof(TradeService);
            host = new ServiceHost(serviceType);
            host.Open();
        }

        protected override void OnStop()
        {
            if(host != null)
               host.Close();
        }
    }
}

另一个问题是我需要担心线程还是由 WCF 服务自动处理?例如,如果 10 台计算机同时查询我的 winforms 应用程序,WCF 是否会无缝地处理这个问题,或者我是否需要实现额外的功能来处理这个问题?

我认为 wcf 将轻松处理此负载。但这取决于您要对其执行的操作。

于 2012-08-03T06:35:02.860 回答
1

对于作为 Windows 服务和 Web 服务托管的服务,您的客户端还需要一个代理类来访问暴露的合同成员。

于 2012-08-03T06:46:59.967 回答