【问题标题】:WCF Proxy fails following call to external APIWCF 代理在调用外部 API 后失败
【发布时间】: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


【解决方案1】:

我终于解决了上面的问题。我从一个名为 InnerChannel 的属性中检索 ClientChannel,该属性使用 Monitor.TryEnter 来确保通道的创建由单个线程执行。创建此锁时出现问题,导致 InnerChannel 未实例化。我重写了 Monitor 代码的关键部分来解决问题。

感谢您的帮助 1.618。

安德鲁

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多