【问题标题】:The value of OperationContext.Current is not the OperationContext value installed by this OperationContextScopeOperationContext.Current 的值不是此 OperationContextScope 安装的 OperationContext 值
【发布时间】:2017-05-26 01:36:29
【问题描述】:

在我的 WebApi 控制器中,我尝试调用 .asmx SOAP 服务。

我使用 VS2015 生成 SoapClient 代理作为服务参考。

我的主要问题是我需要将 Authorization 标头设置为包含 Bearer 令牌。

我想我有一个解决方案,使用@SimonRC 的答案here。我的代码如下所示:

using (OperationContextScope scope = new OperationContextScope(_client.InnerChannel))
{
    var httpRequestProperty = new HttpRequestMessageProperty();
    httpRequestProperty.Headers[System.Net.HttpRequestHeader.Authorization] = "Bearer blahblahblah";
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = httpRequestProperty;

    string packetData = await _client.GetPacketAsync(packetNumber, packetDate.ToString("ddMMMyy"));

    response = new Packet()
    {
        packet = packetData
    };
    return response;
}

这在我在 VS2015 中调试时效果很好,但是当我将我的 WebApi 部署到 Azure 时,我收到了这个错误:

OperationContext.Current的值不是这个OperationContextScope安装的OperationContext值。

我正在寻找 (a) 解决此错误的解决方案,或 (b) 将 Authorization 标头设置为包含不记名令牌的替代方法。

【问题讨论】:

  • 使用 OperationContext 的出色教科书示例,您可以使用 WCF 传递的上下文是使用它的最佳全方位理由之一。您可以使用始终可用的令牌和标识符来做一些非常酷的事情。

标签: wcf azure asp.net-web-api soap-client


【解决方案1】:

将对 SOAP 服务的调用更改为同步而不是异步解决了该问题。

基本上,我改变了这个:

string packetData = await _client.GetPacketAsync(packetNumber, packetDate.ToString("ddMMMyy"));

到这里:

string packetData = _client.GetPacketAsync(packetNumber, packetDate.ToString("ddMMMyy"));

当然,相应的更改链以在任何地方删除异步任务。做到了。

我想从@ChrisMarisic 的评论here 中删除异步,“我知道这个问题很老,但几乎没有理由在 WCF 服务中使用异步。”为这样的 cmets 感到高兴!

【讨论】:

    猜你喜欢
    • 2020-10-08
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2015-12-25
    • 1970-01-01
    相关资源
    最近更新 更多