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」に一致するタグを持つスコープは、インスタンスが要求されたスコープから見えません。これは通常、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);
    }
}

Null参照例外が発生しました。

奇妙なことに、context.Response は null ではありません。スローされるのは .Redirect() を呼び出すときです。

.InstancePerLifetimeScope(); を使用しているかどうか疑問に思っています。が問題です。

ところで、私は Response.Redirect() を使用してみましたが、完全に機能します。

では、何が問題になるのでしょうか?

ありがとう、

カイ

4

2 に答える 2

4

HttpServiceクラスが(シングルトン)コンポーネントとして登録されているようですSingleInstance()。または、依存関係としてあるクラスの 1 つがIHttpServiceシングルトンです。

これが発生すると、Autofac を設定してHttpContextBaseHTTP リクエスト (またはライフタイム スコープも正しい) ごとに新しいインスタンスを返すようにしたとしても、HttpServiceクラスはHttpContextBase、単一のHttpServiceインスタンスが作成された時点で現在のものにハングアップします。

HttpContextBaseこの理論をテストするには、ページから直接依存関係を取得してみて、問題が引き続き発生するかどうかを確認してください。もしそうなら、どれがシングルトンコンポーネントであるかを理解するのはかなり簡単です。

于 2012-06-01T15:06:41.187 に答える
0

ライフタイム スコープで HttpContextWrapper を登録することは、RegisterInstance() を使用するのと似ています。つまり、HttContextWrapper の同じインスタンスを常に使用します。したがって、2 番目のリクエストは最初のリクエストの 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 に答える