【发布时间】:2016-05-05 15:31:44
【问题描述】:
我有一个使用 HttpClient 调用外部 REST API 服务的 Web API 控制器方法。然后,外部 REST 调用的结果通过调用其代理传递给 WCF 服务。
如果我先调用 WCF 代理,然后调用外部 REST 服务,一切都会按预期工作。如果我颠倒调用顺序,WCF 代理调用会失败,因为代理上的 InnerChannel (m_inner_channel = m_channel_factory.CreateChannel()) 为空。
这是一个用于说明目的的示例:
//Call to external REST API Service (works)
user = await m_http_client.GetProfileAsync(id).ConfigureAwait(false);
//Call to WCF Service (works)
using (WCFServiceProxy wcf_proxy = new WCFServiceProxy())
{
config = await wcf_proxy.GetConfigAsync(user.ssid).ConfigureAwait(false);
}
上面的代码有效,但是如果我在 WCF 代理的 InnerChannel (m_inner_channel = m_channel_factory.CreateChannel()) 下面实现代码,则当我调用服务时:
//Instantiate WCF Proxy - Creates ChannelFactory
WCFServiceProxy wcf_proxy = new WCFServiceProxy()
//Call to external REST Service (works)
user = await m_http_client.GetProfileAsync(id).ConfigureAwait(false);
//Call to WCF Service (InnerChannel is no longer instantiated)
config = await wcf_service.GetConfigAsync(user.ssid).ConfigureAwait(false);
如果我按如下所示更改调用顺序,它会再次起作用:
//Instantiate WCF Service
WCFServiceProxy wcf_proxy = new WCFServiceProxy()
//Call to WCF Service (works)
config = await wcf_service.GetConfigAsync("2423432").ConfigureAwait(false);
//Call to external REST Service (works)
user = await m_http_client.GetProfileAsync(id).ConfigureAwait(false);
谁能帮我确定这里发生了什么?如果我将 ConfigureAwait 值更改为 true,问题仍然存在,因此这不是上下文切换问题。
在同一个服务中有多个 Web API 方法调用上述 WCF 代理没有任何问题,只有当我在调用 WCF 代理对象之前调用外部服务时才会出现问题。
我们将不胜感激任何帮助和/或见解。
谢谢你, 安德鲁
【问题讨论】:
-
你能发布堆栈跟踪吗?
-
你有没有试过在调用外部服务后释放HttpClient?
-
感谢以上建议,我正在处理 HttpClient,它在“using”语句中实例化,并且在我的 finally 语句中引用实例化 HttpClient 对象的变量设置为 null。
-
我在这个实例中的堆栈跟踪没有显示任何有用的信息,只是对象没有被实例化。更奇怪的是,我的 WCF 跟踪日志 (SvcTraceViewer.exe) 中没有任何错误。
-
我已经看到当 Dispose() 由于异常而比预期更早地调用对象时会发生类似的情况。例如,HttpListener 可能会发生这种情况。
标签: c# wcf rest asp.net-web-api2 wcf-proxy