7

这是一个运行 .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”匹配的标记的范围。这通常表明注册为 per-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() 并且效果很好。

那么可能是什么问题呢?

谢谢,

4

2 回答 2

4

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

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

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

于 2012-06-01T15:06:41.187 回答
0

使用生命周期注册 HttpContextWrapper 就像使用 RegisterInstance() 一样,也就是说,您将始终使用同一个 HttContextWrapper 实例。因此,第二个请求将使用第一个请求的 HttpContext,从而导致一些奇怪的错误。

可能的解决方法:为 HttpContext 创建自己的包装器,并在实例生命周期中注册它,并让它在内部使用当前的 HttpContext:

public interface IMyWrapper
{
    void ResponseRedirect(string url);
}

public class MyWrapper : IMyWrapper
{
    public void ResponseRedirect(string url)
    {
        HttpContext.Current.Response.Redirect(url);
    }
}

builder.Register(c => new MyWrapper())
    .As<IWrapper>()
    .InstancePerLifetimeScope();

不过,这样你就不会注入 HttpContext。不知道这是否重要...

于 2012-05-28T10:56:48.047 回答