2012-08-08 77 views
0

通常,我必須從ASP.NET應用程序的任何部分跨多個請求訪問相同的信息。使用下面的例子,我嘗試獲取當前請求的URL(通常我忘記了我需要的屬性)。我試圖想出一種類似於ASP.NET處理HttpContext的方法。到目前爲止,我已經拿出以下內容:ASP.NET自定義HttpContext線程問題

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

這使我可以在我自己的上下文之後添加其他屬性。我希望我可以簡單地說:

MyContext.Current.Url; 

但是,它總是在第一次調用時返回頁面的url。我猜這是一些線程問題,但我不知道如何解決它。

我會很感激的幫助。哦,請注意我最好喜歡一種乾淨且易於測試的解決方案。

感謝

+0

爲什麼你需要通過MyContext獲取URL,而是直接從HttpContext.Current.Request獲取? – 2012-08-08 16:21:14

+0

這只是一個例子。 – nfplee 2012-08-08 18:23:52

+0

和您的問題的主要觀點是找到通過http請求共享數據的方式? – 2012-08-08 18:26:02

回答

0

我已經找到了一個不錯的方式來處理這個問題。我最初的想法是將實例存儲在HttpContext.Current.Items集合中(因爲這存在於每個請求中)。後來我才知道,因爲我使用微軟統一爲我的IOC和我定義我自己LifetimeManager存儲對象的集合HttpContext.Current.Items我可以註冊類型中說:

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

現在我可以這樣定義我的靜態屬性:

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

我覺得行的線索與靜態

private static ICustomContext _instance 

嘗試改變它

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

這樣做的麻煩是每次都創建一個新的實例。理想情況下,我希望緩存實例的請求的生命週期。 – nfplee 2012-08-08 15:46:00

+0

爲系統創建對象的實例沒有任何問題。我想補充說,最好創建它然後殺掉它。 – user854301 2012-08-08 15:51:46