托管Windows服务中托管的WCF服务

时间:2014-03-13 23:23:41

标签: c# .net wcf app-config

我按照此(http://msdn.microsoft.com/en-us/library/ms733069.aspx)链接创建了服务和服务主机。 我在解决方案中添加了一个webform客户端项目。为了检查我的服务是否正在接收请求,我在服务中添加了一个日志。 我通过设置多个启动项目选择我的主机和客户端同时运行。 但我在服务和客户端之间进行通信时遇到问题。我在配置中遗漏了什么?我根本没有看到异常(即使我选择了CLR和JSRuntime异常,并且管理调试协助)。

这是我的服务配置

    <?xml version="1.0"?>
    <configuration>
      <system.serviceModel>
        <client/>
        <behaviors>
          <serviceBehaviors>
            <behavior name="meta">
              <serviceMetadata httpGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <services>
          <service name="InboundMessage.Service.Operator" behaviorConfiguration="meta" >
            <endpoint address="basic" binding="basicHttpBinding" contract="InboundMessage.Service.IOperator" name="basic"/>
            <endpoint address="mex" binding="mexHttpBinding"  contract="IMetadataExchange" />
            <!--<endpoint address="" binding="wsHttpBinding" contract="IMetadataExchange" name="Ws"  />-->
            <host>
              <baseAddresses>
                <add baseAddress = "http://IP/InboundMessage.Service/"/>
              </baseAddresses>
            </host>
          </service>
        </services>
        <bindings>
          <basicHttpBinding>
            <binding name="InboundMessage.Service.Operator"/>
          </basicHttpBinding>
        </bindings>
      </system.serviceModel>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
      </startup>
    </configuration>

服务主持人:

     <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <system.serviceModel>
        <behaviors>
          <serviceBehaviors>
            <behavior name="meta">
              <serviceMetadata httpGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <diagnostics performanceCounters="ServiceOnly" />
        <services>
          <service name="InboundMessage.Service.Operator" behaviorConfiguration="meta">
            <endpoint address="basic" binding="basicHttpBinding" contract="InboundMessage.Service.IOperator" name="basic"/>
            <endpoint address="mex" binding="mexHttpBinding"  contract="IMetadataExchange" />
            <!--<endpoint address="" binding="wsHttpBinding" contract="IMetadataExchange" />-->
          </service>
        </services>
      </system.serviceModel>
      <system.web>
        <compilation
            debug="true" >
        </compilation>
      </system.web>
      <system.webServer>
        <directoryBrowse enabled="true"/>
      </system.webServer>
    </configuration>

一个windowform客户端配置:

        <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <configSections>
      </configSections>

      <system.web>
        <compilation debug="true"></compilation>
      </system.web>
      <system.serviceModel>
        <services>
          <service  behaviorConfiguration="meta" name="InboundMessage.Service.Operator">
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            <host>
              <baseAddresses>
                <add baseAddress="http://IP/InboundMessage.Service/"/>
              </baseAddresses>
            </host>
          </service>
        </services>
        <bindings>
         <basicHttpBinding>    
            <binding name="InboundMessage.Service.Operator"/> 
          </basicHttpBinding>
        </bindings>
        <behaviors>
          <serviceBehaviors>
            <behavior name="meta">
              <serviceMetadata httpGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>     
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>                    

编辑: 使用Tim的评论来安装服务,但我在安装它时遇到问题。 我打开了另一个问题,谢谢蒂姆,我在本地机器上安装服务时遇到问题。我打开了另一个问题:Unable to install service using sc command

1 个答案:

答案 0 :(得分:0)

我想到了一些事情。

首先(我不是100%肯定,但这是基于我的经验)你不能通过Visual Studio将Windows服务作为Windows服务运行。您需要构建项目,然后按照链接到的页面上的指示进行安装。

其次,您只需要两个配置文件,而不是三个 - 一个用于Windows服务(服务配置的位置),另一个用于客户端。我不确定您对服务主机配置文件有什么角色(或者您相信)。

第三,您的客户端配置包含<system.serviceModel>部分中服务的条目 - 如果您的客户也在托管服务,您只需要这些条目,在您提出的问题中似乎不是这种情况问。您应该删除<services>部分并添加<client>部分,如下所示:

<client>
  <endpoint address="http://IP/InboundMessage.Service" 
            binding="basicHttpBinding" 
            bindingConfiguration="InboundMessage.Service.Operator" 
            contract="InboundMessage.Service.IOperator" />
</client>

请注意,我使用了上面的bindingConfiguration属性 - 没有这个,您的客户端将使用默认的basicHttpBinding(在您的情况下,这将无关紧要,因为您没有设置除名称之外的任何内容,但是如果您设置了非默认值,则需要告诉客户端使用哪种绑定配置。

实际上,最简单的方法(入门)是构建Windows服务,安装并启动它,然后在客户端(WinForm)应用程序中添加服务引用。这将生成您需要的所有内容,您可以查看配置文件以查看所需的设置。