gpt4 book ai didi

c# - 如何在 Asp.Net(非 MVC)中使用 Autofac 注册 HttpContextBase

转载 作者:太空狗 更新时间:2023-10-29 20:31:26 40 4
gpt4 key购买 nike

这是一个运行 .Net 3.5 的 Asp.net 应用程序(不是 MVC)

我这样做了:

 protected void Application_Start(object sender, EventArgs e)
{

...

builder.Register(c => new HttpContextWrapper(HttpContext.Current))
.As<HttpContextBase>()
.InstancePerHttpRequest();
}

但它不起作用。

我得到的错误:

从请求实例的范围内看不到带有与“httpRequest”匹配的标记的范围。这通常表示注册为每个 HTTP 请求的组件正在被 SingleInstance() 组件(或类似场景)请求。在 Web 集成下,始终从 DependencyResolver.Current 或 ILifetimeScopeProvider.RequestLifetime 请求依赖项,从不从容器本身请求依赖项.

然后我发现了这个:https://stackoverflow.com/a/7821781/305469

我这样做了:

       builder.Register(c => new HttpContextWrapper(HttpContext.Current))
.As<HttpContextBase>()
.InstancePerLifetimeScope();

但是现在当我这样做的时候:

public class HttpService : IHttpService
{
private readonly HttpContextBase context;

public HttpService(HttpContextBase context)
{
this.context = context;
}

public void ResponseRedirect(string url)
{
//Throws null ref exception
context.Response.Redirect(url);
}
}

我得到了一个空引用异常。

奇怪的是,context.Response 不为空,它是在我调用 .Redirect() 时抛出的。

我想知道是否使用 .InstancePerLifetimeScope();是问题所在。

顺便说一句,我尝试使用 Response.Redirect() 并且效果很好。

那么可能是什么问题呢?

谢谢,

最佳答案

看起来您的 HttpService 类可能已注册为 SingleInstance()(单例)组件。或者,将 IHttpService 作为依赖项的类之一是单例。

发生这种情况时,即使您已将 Autofac 设置为每个 HTTP 请求(或生命周期范围,这也是正确的)返回一个新的 HttpContextBase 实例,HttpService当创建单个 HttpService 实例时,类将卡在当前的 HttpContextBase 上。

要测试这个理论,请尝试直接从页面获取对 HttpContextBase 的依赖,看看问题是否仍然存在。如果是的话,找出哪个是单例组件应该相当简单。

关于c# - 如何在 Asp.Net(非 MVC)中使用 Autofac 注册 HttpContextBase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10757932/

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