也许我只是没有得到它,但我有一个部署到IIS 6机器的服务。该机器具有LAN地址和公共互联网地址。
我究竟应该如何能够以可访问的方式发布此服务?
起初我想:没什么大不了的,2个终点。所以我有
<endpoint
address="Address 1"
binding="wsHttpBinding"
bindingConfiguration="DefaultBindingConfiguration"
name="RemoteEndpoint" />
<endpoint
address="Address 2"
binding="wsHttpBinding"
bindingConfiguration="DefaultBindingConfiguration"
name="LocalEndpoint" />
客户端代码如下所示:
public void createServiceProxy()
{
if (Util.IsOperatingLocally())
this.proxy = new ProxyClient("LocalEndpoint");
else
this.proxy = new ProxyClient("RemoteEndpoint");
}
没有骰子。无法添加服务引用。
没有协议绑定与给定地址“地址1”匹配。协议绑定在IIS或WAS配置中的站点级别配置。
然后我想:也许主机标签及其dns标签会有所帮助。不,那是用于身份验证。
然后我想:我将net.tcp用于本地端点。糟糕... IIS 6不支持net.tcp。
然后我想:我知道,ProxyClient构造函数将remoteAddress字符串作为其第二个参数。现在它看起来像:
<endpoint
address=""
binding="wsHttpBinding"
bindingConfiguration="DefaultBindingConfiguration"
name="MyEndpointName" />
public void createServiceProxy()
{
if (Util.IsOperatingLocally())
this.proxy = new ProxyClient("MyEndpointName", "Address 1");
else
this.proxy = new ProxyClient("MyEndpointName", "Address 2");
}
显然不是。尝试实例化ProxyClient时...
在ServiceModel客户端配置部分找不到名称为“MyEndpointName”且收缩MyService.IService的端点元素。
这引导我进入app.config,其生成的客户端部分如下所示:
<client>
<endpoint address="http://localhost:3471/Service.svc" binding="customBinding"
bindingConfiguration="MyEndpointName" contract="MyService.IService"
name="MyEndpointName">
<identity>
<userPrincipalName value="DevMachine\UserNa,e" />
</identity>
</endpoint>
</client>
对我来说这看起来不对。
我的下一个想法并不健康。请帮忙。
答案 0 :(得分:4)
这就是我的所作所为:
PortClient client = new PortClient(); // from the service reference
EndpointAddress endpointAddress;
if (local)
endpointAddress = new EndpointAddress("http://local/Service.svc");
else
endpointAddress = new EndpointAddress("http://remote/Service.svc");
client.ChannelFactory.CreateChannel(endpointAddress);
client.RemoteMethod();
等
答案 1 :(得分:1)
您实际上是在配置文件中放置字符串“Address 1”和“Address 2”吗?
框架始终解析地址以了解要使用的传输。例如“http:// myurl”将使用http,“net.pipe:// localhost / MyNamedPipeExample”将使用IPC。
错误是由于字符串“Address 1”中没有前缀而引起的。
我相信这会有效,而无需对地址进行硬编码:
<endpoint
address="http://serverName/ServiceName/Service.svc"
binding="wsHttpBinding"
bindingConfiguration="DefaultBindingConfiguration"
name="RemoteEndpoint" />
<endpoint
address="http://www.companyName.com/ServiceName/Service.svc"
binding="wsHttpBinding"
bindingConfiguration="DefaultBindingConfiguration"
name="LocalEndpoint" />
答案 2 :(得分:0)
以防万一,我在较新版本的IIS中遇到了相同的错误。在这种情况下,一种可能性是仅指定一个端点,并将地址保留为空字符串。然后将以下内容添加到服务的web.config的system.serviceModel部分:
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
在IE中浏览到我的第二个地址时遇到协议绑定错误,所以我想解决这个问题,而不仅仅是在客户端使用一种解决方法。
此处的multipleSiteBindingsEnabled
设置的更多信息:https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/supporting-multiple-iis-site-bindings