我正在处理一段代码,该代码将向WebAPI控制器发出API请求,并通过该代码调用WCF Web服务。这将阻止,直到WCF服务响应并导致诸如超时和性能问题之类的问题。由于我无法控制的多种原因,我无法对此特定用例使用async / await。
我正在考虑在单独的线程上关闭此WCF调用,因此在WebAPI控制器中我执行以下操作:
New Thread(()=>{
//Call WCF service here
//Do something with the response
}).Start();
然而,代码正在爆炸。调用WCF服务的行未更改为上面的代码块,但现在我得到了:
无法访问已处置的对象。对象名称: ' System.ServiceModel.Channels.ServiceChannel'
在抛出异常时查看堆栈跟踪,我可以看到服务器堆栈跟踪如下:
服务器堆栈跟踪:at System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrImmutable() 在System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan 超时)at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel 频道,TimeSpan超时)at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(时间跨度 超时,CallOnceManager级联)at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway,ProxyOperationRuntime操作,Object [] ins, 对象[]出局,TimeSpan超时)at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime operation)at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(即时聊天 消息)
我对WCF没有多少经验,所以想知道是否有一些关于在后台线程中调用此服务的怪癖,或者是否还有其他我需要做的事情呢?
我尝试使用Google搜索,但所有结果都与从在 WCF服务中调用后台线程有关,而不是从后台调用WCF服务。 / p>
有什么想法吗?
答案 0 :(得分:0)
我非常确定,您在线程外部创建WCF服务的实例。所以以前看起来像:
using(var client = new WcfServiceClient())
{
client.CallSomeMethod();
}
你把它改成了:
using(var client = new WcfServiceClient())
{
new Thread(() => {
client.CallSomeMethod();
}).Start();
}
您需要将客户端创建移动到线程中:
new Thread(() => {
using(var client = new WcfServiceClient())
{
client.CallSomeMethod();
}
}).Start();
}
答案 1 :(得分:0)
所以我最终想到了这一点。这是一个团结问题。出于某种原因,现有代码是:
container.RegisterType<IMyServiceWrapper, MyServiceImplementation>()
我必须明确告诉Unity如何解析构造函数参数:
container.RegisterType<IMyServiceWrapper, MyServiceImplementation>(
new InjectionConstructor(container.Resolve<IMyDependentService>()));
不幸的是,我不知道为什么要这么做或为什么修复它?