具有多个端点的 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);
这是一个序列化问题。
我有一个单例 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);
这是一个序列化问题。