سؤال

واجهة الناشر

[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