【发布时间】: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?请添加有关哪个项目参考哪个的信息。这很重要。