我正在尝试以下列方式开发 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>
上面的不行,能告诉我为什么吗?我已经添加了必要的参考和所有。
谢谢, - 迈克