HttpContext.Current.Items

HttpContext.Current.Items after an Async operation

考虑以下 ASP.NET Web API 委托处理程序:

public class MyHandler : DelegatingHandler

{

  protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)

  {

    var guid = Guid.NewGuid();

    HttpContext.Current.Items["foo"] = guid;



    // An Async operation

    var result = await base.SendAsync(request, cancellationToken);



    //All code from this point is not gauranteed to run on the same thread that started the handler



    var restoredGuid = (Guid)HttpContext.Current.Items["foo"];



    //Is this gauranteed to be true

    var areTheSame = guid == restoredGuid;



    return result;

  }

}

</appSettings>

上面的例子是在一个委托处理程序中,我试图解决的同样的问题也适用于控制器、业务对象等。

我最终试图在每个 HTTP 请求的各种对象之间提供一些简单的内存共享状态

据我了解,在异步操作期间,最初运行该操作的 ASP.NET 线程将返回到线程池,并且在异步操作完成后,可能会使用不同的线程来完成请求。

这会影响 HttpContext.Current.Items 集合吗?

Items 集合中的项目是否保证在请求恢复时存在?

  • 我知道使用 HttpContext.Current 经常被

    由于我完全同意的原因,这些天来更广泛的社区

    与...我只是在帮助某人摆脱困境。

  • 将此数据存储在 Request.Items 集合中不适合解决此问题,因为我的同事由于一些糟糕的设计决策而需要静态。

  • 非常感谢


    As I understand it during Async operations the ASP.NET thread originally running the operation is returned to the thread pool and a different thread may be used to finish the request after the Async operation has completed.

    没错。但是让我们花一分钟时间来谈谈 ASP.NET 上的 async

    async 需要 .NET 4.5。此外,ASP.NET 4.5 在服务器端引入了"怪癖模式",您必须关闭 SynchronizationContext 怪癖。您可以通过将 httpRuntime.targetFramework 设置为 4.5 或使用 aspnet:UseTaskFriendlySynchronizationContext 值为 true.

    appSettings 来执行此操作

    如果您的 web.config 没有这些条目之一,则 async 的行为未定义。有关更多详细信息,请参阅此帖子。我建议使用 targetFramework 设置并修复出现的任何问题。

    Does this affect the HttpContext.Current.Items collection? Is an item that was in the Items collection guaranteed to be there when the Request resumes?

    AspNetSynchronizationContextawait 点保留当前请求上下文。这包括 HttpContext.Current(其中包括 ItemsUser 等)。

    另一种可能是CallContext.Logical[Get|Set]Data,它也流过await点。如果您不希望代码依赖于 HttpContext,这很有用,但开销会稍大。

    几周前,我在服务器端的 async 的 ThatConference 上做了一次演讲;您可能会发现这些幻灯片很有帮助,尤其是那些处理上下文和线程本地状态的幻灯片。


    长话短说,通常应该如此。除非您使用的是 ConfigureAwait(false) ,否则它可能会产生副作用,继续不流动上下文。

    或者尝试在您的应用中添加此设置。

    public class MyHandler : DelegatingHandler
    
    {
    
      protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    
      {
    
        var guid = Guid.NewGuid();
    
        HttpContext.Current.Items["foo"] = guid;
    
    
    
        // An Async operation
    
        var result = await base.SendAsync(request, cancellationToken);
    
    
    
        //All code from this point is not gauranteed to run on the same thread that started the handler
    
    
    
        var restoredGuid = (Guid)HttpContext.Current.Items["foo"];
    
    
    
        //Is this gauranteed to be true
    
        var areTheSame = guid == restoredGuid;
    
    
    
        return result;
    
      }
    
    }
    
    </appSettings>

    更新

    注意!!

    最初我把假的。但它必须是真实的,这样上下文才能流动。


相关推荐

  • Spring部署设置openshift

    Springdeploymentsettingsopenshift我有一个问题让我抓狂了三天。我根据OpenShift帐户上的教程部署了spring-eap6-quickstart代码。我已配置调试选项,并且已将Eclipse工作区与OpehShift服务器同步-服务器上的一切工作正常,但在Eclipse中出现无法消除的错误。我有这个错误:cvc-complex-type.2.4.a:Invali…
    2025-04-161
  • 检查Java中正则表达式中模式的第n次出现

    CheckfornthoccurrenceofpatterninregularexpressioninJava本问题已经有最佳答案,请猛点这里访问。我想使用Java正则表达式检查输入字符串中特定模式的第n次出现。你能建议怎么做吗?这应该可以工作:MatchResultfindNthOccurance(intn,Patternp,CharSequencesrc){Matcherm=p.matcher…
    2025-04-161
  • 如何让 JTable 停留在已编辑的单元格上

    HowtohaveJTablestayingontheeditedcell如果有人编辑JTable的单元格内容并按Enter,则内容会被修改并且表格选择会移动到下一行。是否可以禁止JTable在单元格编辑后转到下一行?原因是我的程序使用ListSelectionListener在单元格选择上同步了其他一些小部件,并且我不想在编辑当前单元格后选择下一行。Enter的默认绑定是名为selectNext…
    2025-04-161
  • Weblogic 12c 部署

    Weblogic12cdeploy我正在尝试将我的应用程序从Tomcat迁移到Weblogic12.2.1.3.0。我能够毫无错误地部署应用程序,但我遇到了与持久性提供程序相关的运行时错误。这是堆栈跟踪:javax.validation.ValidationException:CalltoTraversableResolver.isReachable()threwanexceptionatorg.…
    2025-04-161
  • Resteasy Content-Type 默认值

    ResteasyContent-Typedefaults我正在使用Resteasy编写一个可以返回JSON和XML的应用程序,但可以选择默认为XML。这是我的方法:@GET@Path("/content")@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})publicStringcontentListRequestXm…
    2025-04-161
  • 代码不会停止运行,在 Java 中

    thecodedoesn'tstoprunning,inJava我正在用Java解决项目Euler中的问题10,即"Thesumoftheprimesbelow10is2+3+5+7=17.Findthesumofalltheprimesbelowtwomillion."我的代码是packageprojecteuler_1;importjava.math.BigInteger;importjava…
    2025-04-161
  • Out of memory java heap space

    Outofmemoryjavaheapspace我正在尝试将大量文件从服务器发送到多个客户端。当我尝试发送大小为700mb的文件时,它显示了"OutOfMemoryjavaheapspace"错误。我正在使用Netbeans7.1.2版本。我还在属性中尝试了VMoption。但仍然发生同样的错误。我认为阅读整个文件存在一些问题。下面的代码最多可用于300mb。请给我一些建议。提前致谢publicc…
    2025-04-161
  • Log4j 记录到共享日志文件

    Log4jLoggingtoaSharedLogFile有没有办法将log4j日志记录事件写入也被其他应用程序写入的日志文件。其他应用程序可以是非Java应用程序。有什么缺点?锁定问题?格式化?Log4j有一个SocketAppender,它将向服务发送事件,您可以自己实现或使用与Log4j捆绑的简单实现。它还支持syslogd和Windows事件日志,这对于尝试将日志输出与来自非Java应用程序…
    2025-04-161