我有一个WCF服务,并在Windows服务中托管它。
我尝试从基于.NET 2.0构建的Windows窗体客户端添加服务引用。我可以通过指向httpGetUrl =“http:// localhost:8002 / HBAccess / help / mex”来获取Web引用,但是当我检查Reference.cs时 - 它只包含一个没有任何内容的命名空间。
现在我添加basicHttpBinding并重复相同的步骤:
现在我可以看到Web服务的类。
我的高级同事坚持认为将httpGetEnabled设置为true就足以通过http导出WCF服务并进行适当的Web引用。
有人能指出我在这里缺少的东西吗?
<system.serviceModel>
<services>
<service behaviorConfiguration="HBAcsNX.HBAccessBehavior" name="HBAcsNX.HBAccess">
<!--<endpoint address="" binding="basicHttpBinding" contract="HBAcsNX.HBAccess" />-->
<endpoint address="HBAccess" binding="netTcpBinding" contract="HBAcsNX.HBAccess" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:18264/HBAccess/" />
<add baseAddress="http://localhost:8002/HBAccess/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="HBAcsNX.HBAccessBehavior">
<serviceDebug includeExceptionDetailInFaults="True" httpHelpPageUrl="http://localhost:8002/HBAccess/help" />
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:8002/HBAccess/help/mex" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
//生成的Reference.cs(仅包含命名空间的空代理存根)
#pragma warning disable 1591
namespace Form.ServiceClient {
}
#pragma warning restore 1591
答案 0 :(得分:2)
您必须指定绑定,而basicHttpBinding是唯一可与.NET 2.0客户端互操作的绑定。 .NET 2.0 ASMX客户端仅支持基于HTTP的XML,并且不支持WS- *协议。
答案 1 :(得分:2)
问题是mexHttpBinding
实际上并没有暴露您的服务,它只暴露了您的服务的 defenition ,并且由于.net 2.0不了解nettcp,您会得到一个空名称空间,你需要basicHttpBinding,因为它是你的实际服务端点。
如果查看合同,您会看到mexHttpBinding的合同甚至不是"HBAcsNX.HBAccess"
,而是"IMetadataExchange".
答案 2 :(得分:1)
你的配置不太排队......
<service name="HBAcsNX.HBAccess"
behaviorConfiguration="HBAcsNX.HBAccessBehavior" >
<host>
<baseAddresses>
<add baseAddress="http://localhost:8002/HBAccess/" />
</baseAddresses>
</host>
<endpoint address="mex"
binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
如果您考虑所有这些因素,则会从基地址获得http://localhost:8002/HBAccess/
,并从MEX端点获得mex
- &gt; http://localhost:8002/HBAccess/mex
但是在您的行为配置中,您为MEX使用了不同的地址:
<behavior name="HBAcsNX.HBAccessBehavior">
<serviceMetadata httpGetEnabled="true"
httpGetUrl="http://localhost:8002/HBAccess/help/mex" />
</behavior>
在此,您指向http://localhost:8002/HBAccess/help/mex
- 请注意其中的额外/help
。现在哪一个真的是??
我建议在服务行为配置中抛弃显式的httpGetUrl - 只需使用:
<behavior name="HBAcsNX.HBAccessBehavior">
<serviceMetadata httpGetEnabled="true" />
</behavior>
你应该可以在http://localhost:8002/HBAccess/mex
获得你的MEX。
马克