gpt4 book ai didi

c# - 如何在 MVC6 中正确注入(inject) HttpContext

转载 作者:IT王子 更新时间:2023-10-29 04:26:34 24 4
gpt4 key购买 nike

我的 API 中的数据服务层需要 httpcontext 中请求的信息,我阅读了这个 question他们说我应该使用 ActionContext 而不是 HttpContext.Current(在 MVC6 中停止)。

第一种方式是通过重写这个方法在 Controller 内部设置数据:

public void OnActionExecuting(ActionExecutingContext context)
{
var routeData = context.RouteData;
var httpContext = context.HttpContext;
...
}

或者通过注入(inject)到服务层使用DI

public MyService(IContextAccessor<ActionContext> contextAccessor)
{
_httpContext = contextAccessor.Value.HttpContext;
_routeData = contextAccessor.Value.RouteData;
}

但我不确定下面列出的两行代码是否是执行 DI 的正确方法

services.AddTransient<IContextAccessor<ActionContext>,ContextAccessor>();
services.AddTransient<IContextAccessor<ActionContext>>();

当我这样做时,我得到了这个错误。

尝试激活时无法解析“Microsoft.AspNet.Mvc.ActionContext”类型的服务

更新project.json 网络项目

"DIMultiTenan.Infrastructure": "",
"DIMultiTenan.MongoImplementation": "",
"Microsoft.AspNet.Server.IIS": "1.0.0-beta3",
"Microsoft.AspNet.Mvc": "6.0.0-beta3",
"Microsoft.AspNet.StaticFiles": "1.0.0-beta3",
"Microsoft.AspNet.Server.WebListener": "1.0.0-beta3"

最佳答案

如果您正在尝试访问 HttpContext,那么您可以使用 IHttpContextAccessor 来达到这个目的。

示例:

services.AddTransient<QueryValueService>();

public class QueryValueService
{
private readonly IHttpContextAccessor _accessor;

public QueryValueService(IHttpContextAccessor httpContextAccessor)
{
_accessor = httpContextAccessor;
}

public string GetValue()
{
return _accessor.HttpContext.Request.Query["value"];
}
}

请注意,在上面的示例中,QueryValueService 应仅注册为 TransientScoped 而不是 Singleton 作为HttpContext 基于每个请求...

关于c# - 如何在 MVC6 中正确注入(inject) HttpContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28970140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com