【问题标题】:MSDN WCF service example not workingMSDN WCF 服务示例不起作用
【发布时间】:2012-12-06 07:07:17
【问题描述】:

这个问题是我之前的一个问题,后来我发现它在我的计算机上不能 100% 工作:WCF service not running on non-dev machine

我正在研究这个例子:

http://msdn.microsoft.com/en-us/library/ff649818.aspx

事实证明,InstallUtil 步骤在这里并没有真正起作用。我发现如果 VS2010 已经打开了项目,并且你像教程的第 8 步那样添加服务引用,VS2010 实际上会启动服务主机,因此会创建一个引用。

这是我目前的调试方式:

  • 按照InstallUtil安装服务,关闭VS2010解决方案;然后打开一个完全不同的解决方案(TESTWCF)尝试添加服务引用,但失败 - 在指定地址找不到

  • 再次打开 WCFServiceLibrary1 项目作为 VS2010 的单独实例。尝试添加对 TESTWCF 的服务引用,但失败了。

  • 在 WCFServiceLibrary1 中,尝试第 8 步 - 添加服务引用。这会导致服务主机启动并找到服务。

  • 在服务主机仍在运行的情况下,在 TESTWCF 中我尝试添加服务,它就可以工作了。

  • 关闭服务主机,尝试在TESTWCF中添加引用,还是不行。

这一切似乎完全独立于由 InstallUtil 安装的服务是否运行。

我还通过从头开始创建新的虚拟服务器并逐个加载内容来验证这一点。并且只有在安装 VS2010 后它才开始工作 - 当我在上面观察到时。

有什么想法吗?

【问题讨论】:

    标签: c# wcf windows-services nettcpbinding


    【解决方案1】:

    WCF 服务可以在应用程序(例如控制台或 Windows 窗体应用程序)中自托管

    我认为您过于复杂了,您甚至不必使用 InstallUtil 安装它。 InstallUtil 安装它以作为 Windows 服务运行,您可以制作将作为 WCF 服务的控制台应用程序。

    你必须导入:

    System.ServiceModel
    System.ServiceModel.Web
    System.Web.Services
    

    我认为,如果您想通过 get 和 post 将其用作 Web 服务,则需要那些具有 Web 的功能。

    那么你需要为客户端和服务器指定合约。

    [ServiceContract(Name = "SomeService", Namespace = "http://some.domain.com/some/someservice",SessionMode=SessionMode.Required)]
        public interface ISomeService
        {
            [OperationContract]
            string Execute(string expression);
        }
    

    您有合同,现在您必须在服务中实施它。没什么特别的就用这个界面吧。

    app.config 非常重要,您必须为客户端和服务指定它。在配置中,您拥有指向服务的所有内容。

    在客户端中,您必须添加服务作为参考,它应该像第 8 点一样找到它,但前提是您的配置正常!

    在客户端中,只需在代码中执行类似的操作:

     using (ChannelFactory<ISomeService> channel = new ChannelFactory<ISomeService>("SomeService"))
                {
                    ISomeService svc = channel.CreateChannel();
                    svc.Execute("my expression to evaluate by the service");
                 }
    

    尝试在没有 InstallUtil 的情况下使用最简单的方法,它不必是 Windows 服务来通过网络提供服务。

    【讨论】:

      【解决方案2】:

      成功!经过 4 天的努力,MSDN 教程有一个致命的缺陷。

      在本教程的第一步中,您将创建一个 wcf 服务库,默认情况下它将服务命名为 Service1。在本教程的第 2.6 步中,您需要指定基地址:

      net.tcp://localhost:8523/Service1 
      

      步骤 3 要求您创建一个新的 Windows 服务,默认情况下这也称为 Service1。

      在步骤 5.2 中,您被要求引用 System.ServiceModel 和 WcfServiceLibrary1。

      在步骤 5.6 中,您替换 Onstart 方法以启动服务,步骤 8 显示最终代码为:

      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Diagnostics;
      using System.Linq;
      using System.ServiceProcess;
      using System.Text;
      using System.ServiceModel;
      using WcfServiceLibrary1;
      
      namespace WindowsService1
      {
      public partial class Service1: ServiceBase
      {
          internal static ServiceHost myServiceHost = null; 
      
          public WCFServiceHost1()
          {
              InitializeComponent();
          }
          protected override void OnStart(string[] args)
          {
              if (myServiceHost != null)
              {
                  myServiceHost.Close();
              }
              myServiceHost = new ServiceHost(typeof(Service1));
              myServiceHost.Open();
          }
          protected override void OnStop()
          {
              if (myServiceHost != null)
              {
                  myServiceHost.Close();
                  myServiceHost = null;
              }
          }
      }
      }
      

      错误的关键代码行是:

              myServiceHost = new ServiceHost(typeof(Service1));
      

      好吧,它在 VS2008 或 2005 中的行为可能不同,或者它可能是 VS2010 中的配置,但是,我的 VS2010 将 Service1 解释为包含类的,即:

      WindowsService1.Service1
      

      而实际上应该是:

      WcfServiceLibrary1.Service1
      

      我在 4 天前注意到了这一点,但我认为我对 WCF 的了解不够,而且不知何故我错了 - 特别是当它似乎可以工作时,因为 VS2010 会自行启动它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        相关资源
        最近更新 更多