使用 .Net Core 2.2,我使用 HttpClient 来调用 API 以及 Http 消息处理程序。消息处理程序注入IHttpContextAccessor,但该对象有时包含一个HttpContext为空的属性 - 我无法理解为什么它会为空。
这是启动时的服务注册:
services.AddTransient<HttpClientTokenHandler>();
services.AddHttpClient("client", c =>
{
c.BaseAddress = new Uri(options.ApiUrl.TrimEnd('/') + '/');
}).AddHttpMessageHandler<HttpClientTokenHandler>();
services.AddHttpContextAccessor();
Run Code Online (Sandbox Code Playgroud)
以及 HttpContext 有时为 null 的令牌处理程序实现。
public HttpClientTokenHandler(IHttpContextAccessor context)
{
_context = context;
}
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var access_token = await _context.HttpContext.GetTokenAsync(Constants.TokenTypes.AccessToken);
if (!string.IsNullOrEmpty(access_token))
{
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", access_token);
}
var response = await base.SendAsync(request, cancellationToken);
return response;
}
Run Code Online (Sandbox Code Playgroud)
_context.HttpContext当它只是被注入时,什么可能导致为空?
我在几个场景中使用了 dotnet core 3.1 Web 应用程序中的HttpContextfrom 。IHttpContextAccessor它总是按照我的预期设置。
但是,当注入Razor 组件HttpContext时,始终为 null 。IHttpContextAccessor
@inject IHttpContextAccessor HttpContextAccessor
<div>...</div>
@code {
protected override async Task OnInitializedAsync()
{
// here, HttpContextAccessor.HttpContext == null
}
public string GetSomeInfo()
{
// here, HttpContextAccessor.HttpContext == null
}
}
Run Code Online (Sandbox Code Playgroud)
我已经像这样IHttpContextAccessor添加了Startup.cs/ConfigureServices()
services.AddHttpContextAccessor();
Run Code Online (Sandbox Code Playgroud)
为什么在HttpContext null这里?
我想知道Web API 控制器HttpContext.Request.Path和Web API 控制器之间有什么区别?HttpContext.Request.PathBase我阅读了文档,但不明白预期的差异应该是什么,即使在测试了这两个属性之后:
public async Task<ActionResult<string>> PostItem(ItemPostRequest itemPostRequest)
{
// Output: Path is: '/api/items'
Debug.WriteLine($"Path is: '{HttpContext.Request.Path}'");
// Output: PathBase is: ''
Debug.WriteLine($"PathBase is: '{HttpContext.Request.PathBase}'");
// [...]
}
Run Code Online (Sandbox Code Playgroud)
什么时候PathBase非空?我用的是.NET 5.0。
我有一个托管在 Azure 上的 ASP.NET Blazor Web 应用程序。一切正常,除了一件小事。我按照文档IHttpContextAccessor.HttpContext中的描述使用。
public class SessionService : ISessionService
{
private readonly IHttpContextAccessor httpContextAccessor;
private readonly IUserService userService;
public SessionService(
IUserService userService,
IHttpContextAccessor httpContextAccessor)
{
this.userService = userService;
this.httpContextAccessor = httpContextAccessor;
}
public async Task<User> GetUser()
{
var userId = this.httpContextAccessor.HttpContext?.Items["userId"]?.ToString();
if (userId == null)
{
return null;
}
if (!int.TryParse(userId, out var parsedUserId))
{
return null;
}
return await this.userService.Get(parsedUserId);
}
/// <inheritdoc />
public async Task AuthenticateUser()
{
if (this.httpContextAccessor.HttpContext == null) …Run Code Online (Sandbox Code Playgroud) 克隆当前请求的HttpContext实例最简单的方法是什么?
我正在开发Asp.net MVC v1中的应用程序.我将常规的PartialView功能升级为实际上具有非常相似的子控制器,但具有自己的上下文.使用PartialViews时,必须在主视图的控制器操作中填充局部视图的视图数据.我创建了自己的功能,可以从视图中调用控制器操作.这样我得到:
问题是每个子控制器请求都使用HttpContext.因此,当我在子控制器中设置一些HttpContext.Item时,它实际上填充了实际请求的HttpContext.
这就是我想要克隆HttpContext的原因.我已经在使用:
HttpContext subContext = new HttpContext(request, response);
// what happened to Session, User, Items etc. properties?
Run Code Online (Sandbox Code Playgroud)
但这并没有设置除请求和响应之外的任何内容.但我可能还需要其他属性和集合......如会话,项目,用户......等.
我们有一个多层的Asp.NET Web窗体应用程序.数据层有一个名为DataAccessimpements 的类,IDisposable并且我们将Entity Framework Object Context的实例作为私有字段.该类有许多公共方法返回各种实体集合,并在处理时将处置其对象上下文.
由于我们一直面临的许多问题,我们认为DataAccess在服务器上保持对象上下文(或实例)的范围更长是一个很大的好处.有人建议,以保持一个实例在HttpContext.Current.Items收集从这个职位,以便让每个Http请求一个实例.
我想知道的是:在HttpContext.Current.Session对象中存储我们的对象上下文的实例会产生什么问题/顾虑/问题?
这将相对快速地实施,并且不会影响我们现有的许多单元测试.
我们将使用AutoFac和ServiceProvider类来提供实例.当需要ObjectContext的实例时,它将由类似于此的代码返回:
private static Entities GetEntities(IContext context)
{
if (HttpContext.Current == null)
{
return new Entities();
}
if (HttpContext.Current.Session[entitiesKeyString] == null)
{
HttpContext.Current.Session[entitiesKeyString] = new Entities();
}
return (Entities)HttpContext.Current.Session[entitiesKeyString];
}
Run Code Online (Sandbox Code Playgroud)
干杯.
我有一个静态类,有几个静态方法.在这些方法中,我试图使用访问当前线程的上下文HttpContext.Current.例如:
var userName = HttpContext.Current.User.Identity.Name;
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,我会收到一个NullReferenceException臭名昭着的"对象引用未设置为对象的实例".
有任何想法吗?
asp.net session static-methods httpcontext nullreferenceexception
在我网站的很少页面上,我想确保它们只能通过HTTPS连接访问.实现这一目标的最佳方式是什么?我看到的所有示例似乎都在尝试为整个网站执行此操作.
我希望寻找一种方法来实现这一目标上的Page_Init或Page_Preload.
并重定向到Https版本
我有一个HttpContext.Request对象,该对象的Form数据有误,我想对其进行修复,并以正确的方式发送正确的HttpContext。HttpContext.Request.Form是只读的,但是如果不是,则只需执行以下操作即可;HttpContext.Request.Form [“ a”] =“ a的正确值”;
因此,在管道中执行此操作的最佳位置在哪里。是否可以通过反射访问HttpContext.Request.Form写操作?
这两个属性之间有什么区别?
我可以使用HttpContext.Items而不是在HttpContext.Features之间共享数据middlewares。我看到的唯一区别是,我告诉Items了一个钥匙,它给了我对象,因此我必须强制转换它。此转换可以Features自动完成。
他们后面还有其他东西吗?
httpcontext ×10
asp.net ×4
asp.net-core ×4
c# ×3
session ×2
.net-core ×1
asp.net-mvc ×1
cloning ×1
https ×1
razor ×1
security ×1