WCF端点让我疯狂

时间:2010-10-21 20:13:07

标签: c# .net-3.5 wcf

也许我只是没有得到它,但我有一个部署到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>

对我来说这看起来不对。

我的下一个想法并不健康。请帮忙。

3 个答案:

答案 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