2012-05-25 8 views
7

Dies ist eine Asp.net Anwendung (nicht MVC) läuft .Net 3.5Wie registrieren Httpcontextbase mit Autofac in Asp.Net (nicht MVC)

Ich habe dies:

protected void Application_Start(object sender, EventArgs e) 
{ 

... 

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

Aber es doesn arbeite nicht.

Der Fehler mir dies immer:

Kein Rahmen mit einem Tag Matching ‚httprequest‘ ist sichtbar aus dem Bereich, in dem die Instanz angefordert wurde. Dies bedeutet im Allgemeinen, dass eine als per-HTTP-Anforderung registrierte Komponente von einer SingleInstance() - Komponente (oder einem ähnlichen Szenario) angefordert wird. Unter der Webintegration werden immer Abhängigkeiten von DependencyResolver.Current oder ILifetimeScopeProvider.RequestLifetime angefordert, niemals vom Container selbst .

Also dann fand ich diese: https://stackoverflow.com/a/7821781/305469

Und ich tat dies statt:

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

Aber jetzt, wenn ich dies tun:

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); 
    } 
} 

und ich bekam eine null-Verweisausnahme .

Seltsamerweise context.Response ist nicht null, es ist, wenn ich .Redirect(), dass es werfen.

Ich frage mich, ob .InstancePerLifetimeScope(); ist das Problem.

BTW, versuchte ich mit Response.Redirect() und es funktioniert perfekt.

Also was könnte das Problem sein?

Danke,

Chi

+1

In Ihrem ersten Beispiel mit 'InstancePerHttpRequest' was bedeutet es: funktioniert nicht? Ausnahme usw.? Und wie lösen Sie Ihren 'HttpService' auf oder wie wird er registriert? Wenn Sie die Nullreferenz-Ausnahme erwähnt haben, was ist der vollständige Stack-Trace? – nemesv

+0

Wie Nemesv sagte, warum funktioniert die .InstancePerHttpRequest() Version nicht? – codeulike

+0

Danke Jungs, ich habe die Frage aktualisiert, um den Fehler, den ich bekam, wenn ich .InstancePerHttpRequest() –

Antwort

4

Es sieht so aus, als ob Ihre HttpService-Klasse möglicherweise als SingleInstance() (Singleton) -Komponente registriert ist. Oder eine der Klassen, die IHttpService als Abhängigkeit hat, ist ein Singleton.

Wenn dies geschieht, obwohl Sie Autofac eingerichtet haben eine neue HttpContextBase Instanz pro HTTP-Anforderung (oder Lebensdauer Umfang, der auch richtig ist) zurück die HttpService Klassen hängen an welche auch immer HttpContextBase war Strom, wenn die einzelnen HttpService Instanz wurde erstellt.

Um diese Theorie zu testen, versuchen Sie eine Abhängigkeit von HttpContextBase direkt von einer Seite, und sehen, ob das Problem immer noch auftritt. Herauszufinden, welches die Singleton-Komponente ist, sollte ziemlich einfach sein, wenn dies der Fall ist.

+0

Genau das habe ich gemacht! Der HttpService und andere Dienste, die HttpService aufrufen, sind als Singletons registriert. Danke für deine Hilfe Nicholas. –

+0

@ChiChan basierend auf der Antwort und Ihrem Kommentar oben, was haben Sie geändert, damit es funktioniert? hast du die lebensdauer/umfang des HttpService auf etwas anderes als Singleton geändert? – Stokedout

+0

@Stokedout, ja, es war eine Weile zurück, aber ich habe die Singleon Registrierung von HttpService in einen anderen Bereich gedreht. –

0

HttpContextWrapper Registrierung mit Lebensdauer Anwendungsbereich ist wie RegisterInstance() verwendet wird, das heißt, Sie werden immer die gleiche Instanz von HttContextWrapper verwenden. Die zweite Anforderung wird daher den HttpContext der ersten Anfrage verwenden, was zu einem merkwürdigen Fehler führt. obwohl

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(); 

Auf diese Weise können Sie die Httpcontext nicht injizieren,:

Mögliche Behelfslösung: Erstellen Sie Ihre eigenen Wrapper für Httpcontext und registrieren Sie es mit Beispiel Lebenszeit und lassen Sie es die aktuelle Httpcontext intern verwenden . Nicht sicher, ob das wichtig ist ...

+0

Vielen Dank! Diese Lösung würde funktionieren und ist, was ich derzeit habe, aber ich frage mich immer noch, ob es einen Weg gibt, den Kontext in Autofac friedlich zu registrieren. –

Verwandte Themen