草庐IT

关于异步操作后的 c#:HttpContext.Current.Items

codeneng 2023-03-28 原文

HttpContext.Current.Items after an Async operation

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;
    }
}

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

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

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

这会影响 HttpContext.Current.Items 集合吗?
Items 集合中的项目是否保证在请求恢复时存在?

  • 我知道使用 HttpContext.Current 经常被
    由于我完全同意的原因,这些天来更广泛的社区
    与...我只是在帮助某人摆脱困境。

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

  • 非常感谢

    • 这可能会有所帮助:stackoverflow.com/questions/17261571/...
    • 这个:stackoverflow.com/questions/15196556/…
    • 嗨,杰森,这些问题;虽然相似;不完全一样。不过谢谢。
    • 啊,好的:)不用担心。
    • HttpContext 将被保留,但延续线程可能不同。 AspNetSynchronizationContext 将管理上下文。


    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) ,否则它可能会产生副作用,继续不流动上下文。

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

    1
    </appSettings>

    更新

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

    有关关于异步操作后的 c#:HttpContext.Current.Items的更多相关文章

    1. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

      exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

    2. c# - 如何在 ruby​​ 中调用 C# dll? - 2

      如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

    3. C# 到 Ruby sha1 base64 编码 - 2

      我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

    4. 基于C#实现简易绘图工具【100010177】 - 2

      C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

    5. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

      我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

    6. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

      我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

    7. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

      在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

    8. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

      a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

    9. ruby-on-rails - 如何让 Rails View 返回其关联的操作名称? - 2

      我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam

    10. ruby - 变量赋值后的 if 语句 - 有多常见? - 2

      我最近与一位同事讨论了以下Ruby语法:value=ifa==0"foo"elsifa>42"bar"else"fizz"end我个人并没有看到太多这种逻辑,但我的同事指出,这实际上是一种相当普遍的Rubyism。我试着用谷歌搜索这个主题,但没有找到任何文章、页面或SO问题来讨论它,这让我相信这可能是一种非常实际的技术。然而,另一位同事发现语法令人困惑,而是将上面的逻辑写成这样:ifa==0value="foo"elsifa>42value="bar"elsevalue="fizz"end缺点是value=的重复声明和隐式elsenil的丢失,如果我们想使用它的话。这也感觉它与Ruby

    随机推荐