WCF 代理在调用外部 API 后失败
WCF Proxy fails following call to external API
我有一个 Web API 控制器方法,它使用 HttpClient 调用外部 REST 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 代理对象之前调用外部服务时才会出现问题。
任何帮助 and/or 见解将不胜感激。
谢谢,
安德鲁
我终于解决了上面的问题。我从名为 InnerChannel 的 属性 中检索 ClientChannel,它使用 Monitor.TryEnter 来确保通道的创建由单个线程执行。这个锁的创建有问题,导致 InnerChannel 没有被实例化。我重写了监控代码的关键部分来解决这个问题。
感谢1.618的帮助。
安德鲁
我有一个 Web API 控制器方法,它使用 HttpClient 调用外部 REST 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 代理对象之前调用外部服务时才会出现问题。
任何帮助 and/or 见解将不胜感激。
谢谢, 安德鲁
我终于解决了上面的问题。我从名为 InnerChannel 的 属性 中检索 ClientChannel,它使用 Monitor.TryEnter 来确保通道的创建由单个线程执行。这个锁的创建有问题,导致 InnerChannel 没有被实例化。我重写了监控代码的关键部分来解决这个问题。
感谢1.618的帮助。
安德鲁