/ / ASP.NET Benutzerdefiniertes HttpContext-Threading-Problem - c #, asp.net, Multithreading

ASP.NET Custom HttpContext Threading Problem - c #, asp.net, Multithreading

Oft muss ich auf die gleichen Informationen zugreifenüber mehrere Anforderungen in einem beliebigen Teil meiner ASP.NET-Anwendung. Anhand des nachstehenden Beispiels versuche ich, die URL der aktuellen Anfrage abzurufen (oft vergesse ich, welche Eigenschaft ich benötige). Ich versuche, einen Ansatz zu finden, der dem von HttpContext in ASP.NET ähnelt. Bisher habe ich Folgendes gefunden:

public interface ICustomContext {
HttpContextBase Http { get; }
string Url { get; }
}

public class CustomContext : ICustomContext {
private readonly HttpContextBase _httpContext;

public CustomContext(HttpContextBase httpContext) {
_httpContext = httpContext;
}

public HttpContextBase Http {
get { return _httpContext; }
}

public string Url {
get { return Http.Request.Url.AbsoluteUri; }
}
}

public class MyContext {
private static ICustomContext _instance = new CustomContext(new HttpContextWrapper(HttpContext.Current));

public static ICustomContext Current {
get { return _instance; }
}
}

Auf diese Weise kann ich später zusätzliche Eigenschaften über meinen eigenen Kontext hinzufügen. Ich hoffte, ich könnte einfach sagen:

MyContext.Current.Url;

Beim ersten Aufruf wird jedoch immer die URL der Seite zurückgegeben. Ich vermute, das ist eine Art Threading-Problem, aber ich bin nicht sicher, wie ich es lösen soll.

Ich würde die Hilfe zu schätzen wissen. Oh und bitte beachten Sie, ich würde im Idealfall eine Lösung wünschen, die sauber und leicht überprüfbar ist.

Vielen Dank

Antworten:

0 für die Antwort № 1

Ich denke, der Hinweis liegt in einer Reihe mit statisch Feld

private static ICustomContext _instance

Versuchen Sie es in zu ändern

public static ICustomContext Current {
get { return new CustomContext(HttpContext.Current); }
}

0 für die Antwort № 2

Ich habe einen schönen Weg gefunden, damit umzugehen. Mein erster Gedanke war, die Instanz in der HttpContext.Current.Items-Auflistung zu speichern (da diese pro Anforderung vorhanden ist). Dann wurde mir klar, dass ich Microsoft Unity als IOC verwende und meinen eigenen LifetimeManager definiert habe, der das Objekt in der HttpContext.Current.Items-Auflistung speichert. Ich konnte die Typen mit folgenden Worten registrieren:

container.RegisterType<HttpContextBase>(new InjectionFactory(c => {
return new HttpContextWrapper(HttpContext.Current);
}));
container.RegisterType<ICustomContext, CustomContext>(new PerRequestLifetimeManager<ICustomContext>());

Nun kann ich meine statische Eigenschaft so definieren:

public static ICustomContext Current {
get { return DependencyResolver.Current.GetService<ICustomContext>(); }
}