出版商接口

[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();
        }
    }
有帮助吗?

解决方案

我觉得,你的问题就在这里:

_subscriberServiceHost.AddServiceEndpoint(
                typeof(IPublisherInterface),
                new NetNamedPipeBinding(),
                "Sub");

在订户服务主机正在使用的 IPublisherInterface 合同,这是错误的产生。它应该是的 ISubscriberInterface 而不是

其他提示

您确定与第二主机开放?不应它是:

    ServiceHost _subscriberServiceHost = new ServiceHost(typeof(SubscriberService), new Uri[] { new Uri("net.pipe://localhost/sub") });
    _subscriberServiceHost.AddServiceEndpoint(
            typeof(ISubscriberInterface),
            new NetNamedPipeBinding(),
            "Sub");
    _subscriberServiceHost.Open();

我猜的名字,但我想这可能是你的名字你ISubscriberInterface实现给出。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top