[ServiceContract]
public interface IPublisherInterface
{
[OperationContract(IsOneWay = false)]
void Publish(MessageClass e, string topicName);
}
[ServiceContract(CallbackContract = typeof(IPublisherInterface))]
public interface ISubscriberInterface
{
[OperationContract]
void Subscribe(string topicName);
[OperationContract]
void UnSubscribe(string topicName);
}
class Program
{
static void Main(string[] args)
{
DuplexChannelFactory<ISubscriberInterface> namedPipeFactory =
new DuplexChannelFactory<ISubscriberInterface>(
new InstanceContext(new PublisherService()),
new NetNamedPipeBinding(),
new EndpointAddress("net.pipe://localhost/Sub"));
ISubscriberInterface pipeProxy = namedPipeFactory.CreateChannel();
pipeProxy.Subscribe("name");
//SubscriberForm f = new SubscriberForm(pipeProxy);
//f.ShowDialog();
}
}
为什么我收到此消息?
The message with Action 'http://tempuri.org/ISubscriberInterface/Subscribe' cannot be
processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher.
This may be because of either a contract mismatch (mismatched Actions between sender and
receiver) or a binding/security mismatch between the sender and the receiver. Check that
sender and receiver have the same contract and the same binding (including security
requirements, e.g. Message, Transport, None)."
class Program
{
static void Main(string[] args)
{
ServiceHost _publisherServiceHost = new ServiceHost(typeof(PublisherService), new Uri[] { new Uri("net.pipe://localhost/") });
_publisherServiceHost.AddServiceEndpoint(
typeof(IPublisherInterface),
new NetNamedPipeBinding(),
"Pub");
_publisherServiceHost.Open();
ServiceHost _subscriberServiceHost = new ServiceHost(typeof(PublisherService), new Uri[] { new Uri("net.pipe://localhost/") });
_subscriberServiceHost.AddServiceEndpoint(
typeof(IPublisherInterface),
new NetNamedPipeBinding(),
"Sub");
_subscriberServiceHost.Open();
Console.WriteLine("Server is Running.");
Console.ReadLine();
}
}
答案 0 :(得分:3)
您确定第二个主机开放吗?不应该是:
ServiceHost _subscriberServiceHost = new ServiceHost(typeof(SubscriberService), new Uri[] { new Uri("net.pipe://localhost/sub") });
_subscriberServiceHost.AddServiceEndpoint(
typeof(ISubscriberInterface),
new NetNamedPipeBinding(),
"Sub");
_subscriberServiceHost.Open();
我猜这些名字,但我想这可能是你给ISubscriberInterface实现的名字。
答案 1 :(得分:3)
我想,你的问题就在这里:
_subscriberServiceHost.AddServiceEndpoint(
typeof(IPublisherInterface),
new NetNamedPipeBinding(),
"Sub");
Subscriber服务主机是使用 IPublisherInterface 合同创建的,这是错误的。它应该是 ISubscriberInterface 而不是