0

我正在尝试以下列方式开发 WCF 服务:

  • 一个类库项目,它将包含所有合同及其实现,称为 WcfContracts。

  • 一个 WCF 服务库项目,它将具有配置部分,即它只有 app.config。该项目将引用具有合同及其实现的类库。即 WcfContracts。该项目称为 WcfServiceHosting。

  • 可以托管 WCF 服务的 Windows 服务。该服务将具有与 WCF 服务相同的 app.config,并且仅用于托管 WCF 服务。我在服务项目中创建了一个新的 app.config,并将 app.config 的内容从 WCF 服务库复制到它。

  • 一个 WPF 客户端应用程序,旨在与 Windows 服务中托管的服务进行通信。我正在将 ServiceReference 添加到 WCF 合同中。

  • 所有项目都在同一个解决方案中。

但是,在执行上述操作时,我无法在客户端项目中添加服务引用。如果我将合同和实现保留在同一个 WCF 服务库中,一切正常。

以下是我的 WCF 服务库的 app.config:

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

  <system.web>
    <compilation debug="true" />
  </system.web>

  <system.serviceModel>
    <services>
      <service behaviorConfiguration="WcfServiceHosting.Service1Behavior"
        name="WcfServiceHosting.CalculatorService">
        <endpoint address="" binding="netTcpBinding" bindingConfiguration=""
          contract="**WcfServiceHosting.ICalculatorService**">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
          contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:8523/CalculatorService" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WcfServiceHosting.Service1Behavior">
          <serviceMetadata httpGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

现在上面的工作很好,因为 IcalculatorService 和 CalculatorService 驻留在同一个程序集中,即 WcfServiceHosting。

现在,如果我从 WcfServiceHosting 中删除 ICalculatService 和 CalculatorService 并将其添加到 WcfContracts,我将无法添加服务引用。发现时它不会显示在参考对话框中。

以下是我修改后的合同:

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

  <system.web>
    <compilation debug="true" />
  </system.web>

  <system.serviceModel>
    <services>
      <service behaviorConfiguration="WcfServiceHosting.Service1Behavior"
        name="**WcfContracts.CalculatorService**">
        <endpoint address="" binding="netTcpBinding" bindingConfiguration=""
          contract="WcfContracts.ICalculatorService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
          contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:8523/CalculatorService" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WcfServiceHosting.Service1Behavior">
          <serviceMetadata httpGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

上面的不行,能告诉我为什么吗?我已经添加了必要的参考和所有。

谢谢, - 迈克

4

1 回答 1

0

添加服务参考将无法查看任何未托管的合同。您需要在托管 WCF 服务的项目中引用合同(或将合同包含在其中)。

例如,如果没有主机来包含配置,添加引用如何知道应该如何托管您的 CalculatorServce(TCP、HTTP、NamedPipes、MSMQ)?

于 2012-05-28T18:34:59.670 回答