具有多个端点的 WCF 单例服务?

WCF singleton service with multiple endpoints?

我有一个单例 wcf 服务 (InstanceContextMode.Single),即具有多个端点的 MyService,即 netmsmq 和 http。对 netmsmq 的调用工作正常,但是当我调用它时:

Binding bin = new BasicHttpBinding();
            EndpointAddress end = new EndpointAddress("http://localhost/WcfService1/MyService.svc");
            var obje = new ChannelFactory<IMyService>(bin, end);
            obje.Open();
            var factory = obje.CreateChannel();

            factory.MethodCall(this) ;  //this is ref of MyService1 obj
            obje.Close();

在 Myservice1 的构造函数中,我在以下行得到了一个不可序列化的异常:

factory.MethodCall(this);

在此之后,我在 MyService1 上添加了 [Serializable][KnownType(typeof(MyService1))] 属性,但现在如果我调用 MethodCall 方法,我会收到超时异常。

编辑: MethodCall方法签名在MyService中如下:

public void MethodCall(IMyService1 obj){}

其中 MyService1 实现了 IService。

编辑 2: 结果是 http 调用试图访问 netmsmq 的地址。我在做:

 Binding binding = new BasicHttpBinding();
                Uri via = new Uri("http://localhost/WcfService1/MyService.svc");
                 my_host.AddServiceEndpoint(type, binding, "",via);

而对于 netmsmq,我正在做的是:

var contractName = serviceContract + serviceType.Name; 

nbinding.CustomDeadLetterQueue = new Uri(customDlq);
my_host.AddServiceEndpoint(contractName, nbinding, "net.msmq://localhost/private/MyService.svc");

我在web.config中使用服务激活,我在服务托管环境中设置了multipleSiteBindingsEnabled="true"。我得到的错误是:

"The HTTP request to 'http://localhost/WcfService1/MyService.svc' has exceeded the allotted timeout of 00:00:59.9940000. The time allotted to this operation may have been a portion of a longer timeout."

编辑 3: http 的 wsdl 位置显示为:

http://localhost/WcfService1/MyService.svc

对于 msmq 为:

net.msmq://localhost/private/WcfService1/MyService.svc

合同都是[OperationContract (IsOneWay = true)]

这两项服务都托管在 IIS 上,并且是单个项目的一部分。我在想也许我不能使用单例服务的多个端点。是这个原因吗?我已经研究了 2 天,认为新的一双眼睛可能会成功。 任何帮助,将不胜感激。如果需要,我可以 post 堆栈跟踪。

是的,一个 wcf 单例服务可以有多个端点。

问题已通过在 IMyService 接口中的方法声明上使用 [ServiceKnownType(typeof(MyService1))] 解决。喜欢,

[ServiceKnownType(typeof(MyService1))]
public void MethodCall(IMyService1 obj);

这是一个序列化问题。