我有一个单例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 的 ctor 中,我在以下行得到一个不可序列化的异常:
factory.MethodCall(this);
在此之后,我在 MyService1 上添加了 [Serializable]
和 [KnownType(typeof(MyService1))]
属性,但现在如果我调用 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"
。我得到的错误是:
"对'http://localhost/WcfService1/MyService.svc'的 HTTP 请求已超过分配的超时 00:00:59.9940000。分配给此操作的时间可能是较长超时的一部分。
编辑3:http 的 wsdl 位置显示为:
http://localhost/WcfService1/MyService.svc
对于 MSMQ 作为:
net.msmq://localhost/private/WcfService1/MyService.svc
合同都是[OperationContract (IsOneWay = true)]
这两个服务都承载在 IIS 上,并且是单个项目的一部分。我在想也许我不能使用单例服务的多个端点。这是原因吗?我已经在这里呆了 2 天,认为一双新鲜的眼睛可能会解决问题。任何帮助将不胜感激。如果需要,我可以发布堆栈跟踪。
是的,WCF 单一实例服务可以有多个终结点。
此问题已通过在 IMyService 接口中的方法声明上使用[ServiceKnownType(typeof(MyService1))]
得到解决。喜欢
[ServiceKnownType(typeof(MyService1))]
public void MethodCall(IMyService1 obj);
这是一个序列化问题。