- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我查看了如何在 .NET Core 中创建 HttpContext。然后我发现有一个类叫HttpContextFactory
创建和分配 HttpContext
对象变成 HttpContext
HttpContextAccessor
的属性(property)类(class)。为了在我们的代码中使用 HttpContext 对象,我们将 IHttpContextAccessor 注入(inject)到需要该对象的类的构造函数中。
当我查看 HttpContextAccessor 的实现时,显然它的 HttpContext 属性从私有(private)的 AsyncLocal
中获取了 HttpContext 对象值。变量和后来在 HttpContextAccessor 上注册为 单例 .
https://github.com/aspnet/AspNetCore/blob/master/src/Http/Http/src/HttpContextAccessor.cs
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Threading;
namespace Microsoft.AspNetCore.Http
{
public class HttpContextAccessor : IHttpContextAccessor
{
private static AsyncLocal<HttpContextHolder> _httpContextCurrent = new AsyncLocal<HttpContextHolder>();
public HttpContext HttpContext
{
get
{
return _httpContextCurrent.Value?.Context;
}
set
{
var holder = _httpContextCurrent.Value;
if (holder != null)
{
// Clear current HttpContext trapped in the AsyncLocals, as its done.
holder.Context = null;
}
if (value != null)
{
// Use an object indirection to hold the HttpContext in the AsyncLocal,
// so it can be cleared in all ExecutionContexts when its cleared.
_httpContextCurrent.Value = new HttpContextHolder { Context = value };
}
}
}
private class HttpContextHolder
{
public HttpContext Context;
}
}
}
using System.Threading;
namespace Microsoft.AspNetCore.Http
{
public class HttpContextAccessor : IHttpContextAccessor
{
private HttpContextHolder _httpContextCurrent;
public HttpContext HttpContext
{
get
{
return _httpContextCurrent?.Context;
}
set
{
if (value != null)
{
_httpContextCurrent = new HttpContextHolder { Context = value };
}
}
}
private class HttpContextHolder
{
public HttpContext Context;
}
}
}
services.TryAddScope<IHttpContextAccessor, HttpContextAccessor>();
最佳答案
只要是单例,解析IHttpContextAccessor
实例可以由单例服务永久持有并正常工作,而如果单例服务解析范围IHttpContextAccessor
,则可能会导致问题。 .
关于c# - 带有 AsyncLocal 与 Scope 服务的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56762651/
在最近的 PR 评论中提出了一个问题,即是否 AsyncLocal>应该使用 ConcurrentDictionary<> .我的想法是它不需要,因为多个线程不会同时访问 AsyncLocal 值。但
.NET 4.6 引入了 AsyncLocal用于沿着异步控制流流动环境数据的类。我以前用过 CallContext.LogicalGet/SetData为此目的,我想知道这两者在语义上是否以及以何种
为什么从类的异步方法设置时不保留 AsyncLocal 字段的值。考虑这个例子: var scope = new TestScope(); // The default value is 0 Cons
DotNet Fiddle 链接 https://dotnetfiddle.net/GqA32R 我有以下示例代码来演示异步本地功能 static AsyncLocal _asyncLocalStri
我正在努力寻找 AsyncLocal 功能的简单文档。 我写了一些我认为告诉我答案是"is"的测试,但如果有人能证实这一点就太好了! (特别是因为我不知道如何编写可以明确控制线程和延续上下文的测试..
当我调用WrapperAsync时,AsyncLocalContext.Value返回null。当我在方法外部运行相同的代码块时,在 Main 方法中,AsyncLocalContext.Value
考虑这个例子: class Program { private static readonly ITargetBlock Mesh = CreateMesh(); private st
我正在处理一个非常大且旧的桌面 winform 应用程序代码库。在此代码库中,有很多操作在后台线程中执行,主要使用 BackgroundWorker。 . 此代码库中的一个常见模式是通过将工件绑定(b
在 ASP.NET Core 中,我使用的是 IHttpContextAccessor访问当前 HttpContext . HttpContextAccessor uses AsyncLocal .
我查看了如何在 .NET Core 中创建 HttpContext。然后我发现有一个类叫HttpContextFactory创建和分配 HttpContext对象变成 HttpContext Http
我读到了AsyncLocal来自 the MSDN documentation ,但有一点我还不清楚。 我正在研究诸如上下文绑定(bind)缓存/内存之类的东西,其目的很简单,就是在逻辑请求中存储数据
我正在使用 Azure 函数,需要将 HttpRequestMessage 传递到所调用的整个异步/等待函数链。在这种情况下我可以使用 AsyncLocal 吗? 共享代码: public class
我正在尝试了解 AsyncLocal 在 .Net 4.6 中的工作方式。我正在将一些数据放入 AsyncLocal...但是当 ThreadContext 更改时它被设置为 null。我使用 Asy
我不太了解这种情况,其中 AsyncLocal instance设置在 AuthenticationHandler 中的某个点,但没有到达 Controller ,当它被注入(inject) cons
对于 .NET 核心, AsyncLocal 是 CallContext 的替代品.但是,尚不清楚在 ASP.NET Core 中使用它有多“安全”。 在 ASP.NET 4 (MVC 5) 和更早版
在以下示例中,我将值设置为 AsyncLocal我的变量HttpApplication Application_BeginRequest() 中的子类(即 Global.asax) : public
在 Controller 作用域中解析的元素上调用 Dispose 之前,执行上下文似乎不会保留。这可能是由于 asp.net core 必须在 native 代码和托管代码之间跳转,并在每次跳转时重
TL;DR ThreadLocal.Value 指向相同的位置,如果 Thread.CurrentThread 保持不变。 AsyncLocal.Value 是否有类似的东西(例如,Sychroniz
查找演示此问题的完整示例应用程序 here . 我正在尝试使用 OWIN 中间件填充 WebForms 页面可访问的静态标识符,但我注意到对于某些类型,这并不直观 - 特别是 AsyncLocal .
我不得不用 AsyncLocal 替换代码中 ThreadLocal 的使用,以便在等待异步操作时保持“环境状态”。 但是,AsyncLocal 的一个令人讨厌的行为是它“流”到子线程。这与 Thre
我是一名优秀的程序员,十分优秀!