从消息检查器访问HttpContext.Current以进行异步WCF调用

时间:2019-02-07 14:27:03

标签: c# wcf asp.net-mvc-5 async-await httpcontext

序言:在我们的应用中,我们有一些基于自定义消息检查器的逻辑。它解析WCF消息并通过HttpContext.Current在当前Http上下文中设置数据(会话或cookie)。
情况:切换到异步WCF调用后,我们无法访问当前上下文,即现在的null。我了解await在工作期间实际上保存了上下文并破坏了线程,但是也许有一种方法可以用更少的鲜血和没有危险的技术来解决此问题?

更新:这是一些代码。同步版本:

public ActionResult Task()
{
//some logic
var result = ourService.DoCall();
//some logic
}
//in WCF message inspector
public void AfterReceiveReply(ref Message reply, object correlationState)
{
var request = HttpContext.Current; //got context here
}

异步版本:

public async Task<ActionResult> Task()
{
//some logic
var result = await ourService.DoCallAsync();
//some logic
}
//in WCF message inspector
public void AfterReceiveReply(ref Message reply, object correlationState)
{
var request = HttpContext.Current; //got null
}

1 个答案:

答案 0 :(得分:0)

关于WCF的一点说明,当托管在ASP.NET站点内运行的WCF服务时,您需要启用aspnetCompatability模式,这可以在Wen.config中完成

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

或使用

在服务级别上个性化
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}

您可以在Microsoft页上查看详细信息,这应该为您提供有关该模式的更多信息。启用该模式将使WCF在ASP.NET管道下运行,而不是创建模块来连接事件。管道,这也将允许您访问HttpContext对象,如果未启用该设置,则该对象为null

参考文章中的文章:

  

HttpContext:从WCF内部访问时,Current始终为null   服务。请改用RequestContext。


  

RequestContext的值可以为null。因为的作用   请求上下文是将请求链接到回复,这没有任何意义   在没有回复的情况下具有请求上下文,因此在此   如果上下文设置为null。对于单向操作的顶部   请求/回复模型,服务器接收请求但不发送   向客户回复。因此,如果RequestContext为null   意外地,首先检查操作合同是否为IsOneWay。

https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.channels.requestcontext?view=netframework-4.7.2退出

OperationContract标头上指定单向响应时,请求上下文为空。

可以使用

访问RequestContext
rcontext = operationContext.RequestContext