【问题标题】:Hosting a WCF service over TCP | Structuring Project通过 TCP 托管 WCF 服务 |构建项目
【发布时间】:2012-06-02 23:19:54
【问题描述】:

我正在尝试通过以下方式开发 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>

上述方法不起作用,你能告诉我为什么吗?我已经添加了必要的参考资料。

谢谢, - 迈克

【问题讨论】:

  • 如果我的解释是正确的,我认为您缺少的是 .config 不共享。执行程序将加载它的配置,而不是任何附属/引用的程序集。
  • 你的意思是Reference.cs中没有代码是generaterd?请添加有关哪个项目参考哪个的信息。这很重要。

标签: c# wcf


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    相关资源
    最近更新 更多