Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf OperationContext.Current的值不是此OperationContextScope安装的OperationContext值_Wcf_Azure_Asp.net Web Api_Soap Client - Fatal编程技术网

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

Wcf OperationContext.Current的值不是此OperationContextScope安装的OperationContext值,wcf,azure,asp.net-web-api,soap-client,Wcf,Azure,Asp.net Web Api,Soap Client,在我的WebApi控制器中,我试图调用.asmxSOAP服务 我使用VS2015生成SoapClient代理作为服务引用 我的主要问题是,我需要将授权头设置为包含承载令牌 我想我已经找到了一个解决方案,使用@SimonRC的答案。我的代码如下所示: using (OperationContextScope scope = new OperationContextScope(_client.InnerChannel)) { var httpRequestProperty = new Htt

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

我使用VS2015生成SoapClient代理作为服务引用

我的主要问题是,我需要将授权头设置为包含承载令牌

我想我已经找到了一个解决方案,使用@SimonRC的答案。我的代码如下所示:

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

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

基本上,我改变了这一点:

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

string packetData = _client.GetPacketAsync(packetNumber, packetDate.ToString("ddMMMyy"));
当然,链的上游也会进行相应的更改,以删除所有的异步任务。成功了


我的想法是从@chrismaric的评论中删除async,“我知道这个问题很老了,但在WCF服务中几乎没有理由使用async。”很高兴有这样的评论

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