我有一个在 LAN 上运行良好的 WCF 服务,但是当尝试从服务引用外部访问它时失败。
我的 WCF 服务托管在使用静态 IP 无域的 win2k3 机器上。
我有一个在 LAN 上运行良好的 WCF 服务,但是当尝试从服务引用外部访问它时失败。
我的 WCF 服务托管在使用静态 IP 无域的 win2k3 机器上。
这对我有用。在配置文件中
< serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
< / system.serviceModel >
如果它设置为 false,我得到了那个疯狂的计算机名替换。
multipleSiteBindingsEnabled="true"
似乎这是我必须做的一切才能正常工作。
我正在研究一种从 HTTP 请求重用 Host 标头的方法。在我看来,这应该在开发中像在生产中一样工作。
事实证明很简单:
<behaviors>
<serviceBehaviors>
<behavior name="...">
...
<useRequestHeadersForMetadataAddress />
</behavior>
</serviceBehaviors>
</behaviors>
这样,如果客户端可以访问 WSDL 端点,这将确保所有关联的 wsdl/xsd 资源都可以使用相同的基本 url 访问。
经过一番挖掘后,我找到了答案 - 这是我发现的,希望它可以节省其他人一些时间和麻烦。
1.) 将 IP 添加到端点地址并添加带有基本 IP 地址的主机名,如下所示:
<endpoint
address="http://xx.xx.xx.xx/ServiceApp/Service.svc"
binding="basicHttpBinding" contract="IService">
</endpoint>
<host>
<baseAddresses>
<add baseAddress="http://xx.xx.xx.xx/ServiceApp/" />
</baseAddresses>
</host>
这曾经足以使我的服务参考工作,但迪斯科文件开始以计算机名称而不是 ip 返回(我认为这是在更新到 .NET 4.0 之后)。
2.) 如果您有域名 (www.myDomain.com),则将其添加到 IIS 的主机标头中。
3.) 将 IP 地址和计算机名称添加到客户端主机文件中(但是,简单的修复并不总是可以让所有客户端都将其添加到他们的主机文件中)
4.) 我发现的最佳解决方案是按照此处的“Timetheos”帖子实现 ServiceHosts 工厂属性:http: //social.msdn.microsoft.com/Forums/en-US/wcf/thread/c7fd51a2-773e-41d4 -95a0-244e925597fe
这对我来说效果很好,因为我可以在本地测试开发和调试我的服务库,然后使用服务应用程序将服务部署到我的开发服务器,并且在发布后不必更改任何配置文件。
整个过程简直就是一场噩梦,我不希望任何人这样做,所以如果您处于同样的情况并且需要有关上述几点的更多信息,请与我们联系!
您可以使用星号 *(通配符)代替基本 url 中的 LocalHost 或机器名称,如下所示:
<add baseAddress="net.tcp://*:4502/WxWcfService_01" />
像这样设置服务端点和httpgeturl。
<services>
<service behaviorConfiguration="serviceBehaviour" name="Demo.Service.MultiEndPointsService">
<endpoint address="http://192.168.1.2/Demo.Service/MultiEndPointsService.svc/basic" binding="basicHttpBinding" bindingConfiguration="basicBinding" contract="Demo.Service.MultiEndPointsService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="serviceBehaviour">
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://192.168.1.2/Demo.Service/MultiEndPointsService.svc/basic"/>
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>