C# WCF-地址筛选器不匹配

C# WCF-地址筛选器不匹配,c#,.net,wcf,C#,.net,Wcf,我有一个自托管的WCF服务,调用时遇到以下异常: 此消息已发送到“net”。tcp://localhost:53724/Test1"不可能 由于接收端的AddressFilter不匹配,在接收端处理 端点调度器。检查发送方和接收方的 我同意 有效的解决方案是在服务接口的实现类之前添加[ServiceBehavior(AddressFilterMode=AddressFilterMode.Prefix)]。但事实不应该如此!所以,我试图找到错误的根源,以便消除它 我发现了 当我添加了Service

我有一个自托管的WCF服务,调用时遇到以下异常:

此消息已发送到“net”。tcp://localhost:53724/Test1"不可能 由于接收端的AddressFilter不匹配,在接收端处理 端点调度器。检查发送方和接收方的 我同意

有效的解决方案是在服务接口的实现类之前添加
[ServiceBehavior(AddressFilterMode=AddressFilterMode.Prefix)]
。但事实不应该如此!所以,我试图找到错误的根源,以便消除它

我发现了 当我添加了
ServiceBehavior
属性并且调用成功时-如下:
OperationContext.Current.EndpointDispatcher.EndpointAddress
返回:
net。tcp://localhost/Test1
-请注意缺少端口。这实际上就是我为
ServiceHost.Open方法提供的内容。但是添加端口是因为我指定了
ListenUriMode.Unique

那么:如何使用
AddressFilterMode.Exact
修复错误

要复制的代码:

[ServiceContract]
public interface IWCF1
{
    [OperationContract]
    bool SendMessage(string message);
}

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Prefix)]
public class WCF1 : IWCF1
{
    public bool SendMessage(string message)
    {
        Debug.WriteLine("Message: " + message);
        Debug.WriteLine(OperationContext.Current.EndpointDispatcher.EndpointAddress, "EndpointAddress");//Does not include the port!
        return true;
    }
}


public void test()
{
    Uri uri2 = Service(typeof(WCF1), typeof(IWCF1), "Test1");
    IWCF1 iwcf1 = CreateChannel(uri2.ToString());
    new Task(() => iwcf1.SendMessage("abc")).Start();
}

public Uri Service(Type class1, Type interface1, string uri)
{
    string serviceUri = "net.tcp://localhost/" + uri;
    ServiceHost host = new ServiceHost(class1, new Uri(serviceUri));
    ServiceEndpoint ep = host.AddServiceEndpoint(interface1, new NetTcpBinding(SecurityMode.None), serviceUri);
    ep.ListenUriMode = ListenUriMode.Unique;
    host.Open();
    return host.ChannelDispatchers[0].Listener.Uri;
}

public static IWCF1 CreateChannel(string address)
{
    EndpointAddress ep = new EndpointAddress(address);
    ChannelFactory<IWCF1> channelFactory = new ChannelFactory<IWCF1>(new NetTcpBinding(SecurityMode.None), ep);
    return channelFactory.CreateChannel();
}
[服务合同]
公共接口IWCF1
{
[经营合同]
boolsendmessage(字符串消息);
}
[ServiceBehavior(AddressFilterMode=AddressFilterMode.Prefix)]
公共类WCF1:IWCF1
{
公共bool发送消息(字符串消息)
{
Debug.WriteLine(“Message:+Message”);
Debug.WriteLine(OperationContext.Current.EndpointDispatcher.EndpointAddress,“EndpointAddress”);//不包括端口!
返回true;
}
}
公开无效测试()
{
Uri uri2=服务(typeof(WCF1)、typeof(IWCF1)、“Test1”);
IWCF1 IWCF1=CreateChannel(uri2.ToString());
新任务(()=>iwcf1.SendMessage(“abc”)).Start();
}
公共Uri服务(类型class1,类型interface1,字符串Uri)
{
string serviceUri=“net。tcp://localhost/“+uri;
ServiceHost主机=新ServiceHost(class1,新Uri(serviceUri));
ServiceEndpoint ep=host.AddServiceEndpoint(interface1,新的NetTcpBinding(SecurityMode.None),serviceUri);
ep.ListenUriMode=ListenUriMode.Unique;
host.Open();
返回host.ChannelDispatchers[0].Listener.Uri;
}
公共静态IWCF1 CreateChannel(字符串地址)
{
EndpointAddress ep=新的EndpointAddress(地址);
ChannelFactory ChannelFactory=新的ChannelFactory(新的NetTcpBinding(SecurityMode.None),ep);
返回channelFactory.CreateChannel();
}

我怀疑
AddressFilterMode.Exact
错误的来源涉及逻辑端点和物理服务地址之间的差异

EndpointAddress
是服务的逻辑地址,是SOAP消息的地址。
ListenUri
是服务的物理地址。它具有端口和地址信息,服务端点在其中实际侦听当前计算机上的消息。调度器使用逻辑端点地址(而不是物理服务位置)进行匹配和筛选,因此,无法找到完全匹配的服务

物理地址与逻辑地址不同:

  net.tcp://localhost:53724/Test1  !=  net.tcp://localhost/Test1  
需要考虑的几个选项:
继续使用
AddressFilterMode.Prefix

尝试指定主机名比较模式 提前指定端口

参考资料:

接受答案。但是如果有一些源代码就好了。第二个参考现在只能作为.chm下载()提供。我不知道用这个链接还是用一个archive.org来替换这个链接更好。