在我的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)设置授权标头以包含承载令牌的替代方法。
答案 0 :(得分:2)
将对SOAP服务的调用更改为同步而不是异步解决了问题。
基本上,我改变了这个:
string packetData = await _client.GetPacketAsync(packetNumber, packetDate.ToString("ddMMMyy"));
对此:
string packetData = _client.GetPacketAsync(packetNumber, packetDate.ToString("ddMMMyy"));
当然,相应的变化链在各地删除异步任务。这样做了。
我想从@ChrisMarisic的评论here中删除异步“我知道这个问题已经过时了,但是几乎没有理由在WCF服务中使用异步。”很高兴收到这样的评论!