OperationContext.Current的值不是此OperationContextScope安装的OperationContext值

时间:2017-05-26 01:36:29

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

在我的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)设置授权标头以包含承载令牌的替代方法。

1 个答案:

答案 0 :(得分:2)

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

基本上,我改变了这个:

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

对此:

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

当然,相应的变化链在各地删除异步任务。这样做了。

我想从@ChrisMarisic的评论here中删除异步“我知道这个问题已经过时了,但是几乎没有理由在WCF服务中使用异步。”很高兴收到这样的评论!