可以为多个WCF服务合同添加一个服务引用

时间:2009-11-02 13:17:09

标签: wcf wcf-client

我在一个WCF库中定义了多个服务契约,这些托管在Windows服务下托管。 这些服务在Windows服务配置文件中公开如下:

<services>
  <service behaviorConfiguration="ReportingComponentLibrary.TemplateServiceBehavior"
    name="ReportingComponentLibrary.TemplateService">
    <endpoint address="" binding="wsHttpBinding" contract="ReportingComponentLibrary.ITemplateService" bindingConfiguration="wsHttp" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" ></endpoint>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8080/ReportingComponentLibrary/TemplateService/" />
      </baseAddresses>
    </host>
  </service>
  <service behaviorConfiguration="ReportingComponentLibrary.TemplateServiceBehavior"
    name="ReportingComponentLibrary.TemplateReportService">
    <endpoint address="" binding="wsHttpBinding" contract="ReportingComponentLibrary.ITemplateReportService" bindingConfiguration="wsHttp" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" ></endpoint>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8080/ReportingComponentLibrary/TemplateReportService/" />
      </baseAddresses>
    </host>
  </service>
</services>

现在,当我在客户端应用程序中添加服务引用时,

是否可以为上述两项服务添加一个服务参考或

我需要为每个服务/服务合同分开参考。

更新

以下是我的申请详情:

我有三个不同的项目:

  1. WCF服务库
  2. 用于托管WCF服务的Windows服务
  3. 客户端 - 测试控制台应用程序
  4. 现在,WCF服务库中的App.Config如下:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>     
    
      <system.serviceModel>
        <bindings>
          <wsHttpBinding>
            <binding name="wsHttp" maxReceivedMessageSize="50000000" maxBufferPoolSize="50000000" messageEncoding="Mtom">
              <readerQuotas maxDepth="500" maxStringContentLength="500000000" maxArrayLength="500000000"
              maxBytesPerRead="500000000" maxNameTableCharCount="500000000" />
            </binding>
          </wsHttpBinding>
        </bindings>
    
        <services>
          <service behaviorConfiguration="ReportingComponentLibrary.TemplateServiceBehavior"
            name="ReportingComponentLibrary.TemplateService">
            <endpoint address="" binding="wsHttpBinding" contract="ReportingComponentLibrary.ITemplateService" bindingConfiguration="wsHttp" >
              <identity>
                <dns value="localhost" />
              </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" ></endpoint>
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8080/ReportingComponentLibrary/TemplateService/" />
              </baseAddresses>
            </host>
          </service>
    
          <service behaviorConfiguration="ReportingComponentLibrary.TemplateServiceBehavior"
            name="ReportingComponentLibrary.TemplateReportService">
            <endpoint address="" binding="wsHttpBinding" contract="ReportingComponentLibrary.ITemplateReportService" bindingConfiguration="wsHttp" >
              <identity>
                <dns value="localhost" />
              </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8080/ReportingComponentLibrary/TemplateReportService/" />
              </baseAddresses>
            </host>
          </service>
    
        </services>
    
        <behaviors>
          <serviceBehaviors>
            <behavior name="ReportingComponentLibrary.TemplateServiceBehavior">
              <serviceMetadata httpGetEnabled="True"/>
              <serviceDebug includeExceptionDetailInFaults="True" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>
    

    Windows Service中的App.Config与上面相同。

    现在在我的客户端应用程序中,我需要使用TemplateService和TemplateReportService中的方法。

    因此,我总是可以使用两种不同的服务引用:

    http://localhost:8080/ReportingComponentLibrary/TemplateService/

    http://localhost:8080/ReportingComponentLibrary/TemplateReportService/

    这一切都正常。

    但我想知道是否有任何方法(除了你建议的包装解决方法) 通过它我只需要添加一个引用和 我可以从两个服务中调用方法。

2 个答案:

答案 0 :(得分:5)

目前,我不认为这是可能的,你需要2个服务参考,因为他们都实施单独的合同。假设您可以控制服务代码,您可以实现一种解决方法,您可以通过指向两个单独的服务来创建服务包装器来实现两个合同。这将允许您有一个服务参考。是否有一个特定的问题,为什么你想要他们在一个服务而不是两个服务?

编辑: 这个Blog Article - Meineck.Net向您展示了如何配置您的服务以实现您所追求的目标,但这又是一个很好的解决方法。祝你好运。

答案 1 :(得分:2)

一个服务参考=一个服务合同

您的Windows服务中包含许多服务,每个服务都有自己的合同。

然而,没有什么可以阻止您创建包含所有服务功能的单个合同,然后创建一个实现该合同的类,但只是通过层传递给其他服务。