2012-07-10 49 views
4

我有一個基於特定條件的頁面,我要麼做Response.Redirect或Server.Transfer。現在我想爲這兩種情況添加一個標題。所以我做了以下如何在Server.Transfer之前在Asp.Net中設置Response Header?

Response.AddHeader("Vary", "User-Agent"); 

    if (condition) 
    { 
     Server.Transfer(redirectUrl); 
    } 
    else 
    { 
     Response.Redirect(redirectUrl); 
    } 

現在,當代碼通過Server.Transfer的代碼路徑得好,Vary標頭被設置爲*而當它通過Response.Redirect的去頭正確設置爲用戶代理。

爲什麼會發生這種情況,我怎樣才能將Response Header設置爲相同的情況?

回答

4

安德烈是正確的響應對象被替換爲Server.Transfer一部分。如果您希望將要轉移到的頁面轉換爲不可知的父頁面,則可以將信息轉換爲HttpContext.Items,然後使用IHttpModule來提取信息並正確配置標題。像這樣的東西可能會做這個工作...

Items.Add(VaryHttpModule.Key, "User-Agent"); 

if (condition) 
{ 
    Server.Transfer(redirectUrl); 
} 
else 
{ 
    Response.Redirect(redirectUrl); 
} 

public class VaryHttpModule : IHttpModule 
{ 
    public const string Key = "Vary"; 

    public void Init(HttpApplication context) 
    { 
     context.PostRequestHandlerExecute += 
      (sender, args) => 
       { 
        HttpContext httpContext = ((HttpApplication)sender).Context; 
        IDictionary items = httpContext.Items; 
        if (!items.Contains(Key)) 
        { 
         return; 
        } 

        object vary = items[Key]; 
        if (vary == null) 
        { 
         return; 
        } 

        httpContext.Response.Headers.Add("Vary", vary.ToString()); 
       }; 
    } 

    public void Dispose() 
    { 
    } 
} 

乾杯!

6
當你調用 Server.Transfer

,當前頁面的響應對象將由目標頁面的響應對象(這是實際上將被髮送到用戶的響應)取代。 所以,如果你想設置這個特定的標題屬性,你必須在目標頁面上執行它。

如果是有條件的,也許可以使用HttpContext.Items屬性,即在第一頁上設置並在第二頁上閱讀。

問候

+2

我認爲在這種情況下HttpContext.Items可能比Session更合適。會話將在請求中持續存在,而一旦請求完成,項目將被清除。 – 2012-07-10 16:13:44

+0

@DeanWard你有點!隨意編輯有關此改進的答案。 – 2012-07-10 16:16:03

相關問題