2012-07-10 66 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

相关问题