如何在Asp.Net中的Server.Transfer之前设置响应头?

时间:2012-07-10 16:03:26

标签: c# asp.net http-headers response.redirect server.transfer

我有一个页面,根据某些条件我要么做一个Response.Redirect或Server.Transfer。现在我想为两个案例添加一个标题。所以我正在做以下

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

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

现在,当代码通过Server.Transfer代码路径时,Vary标头设置为*,而当它通过Response.Redirect时,标头正确设置为User-Agent。

为什么会发生这种情况?如何将两个案例的响应标头设置为相同?

3 个答案:

答案 0 :(得分:6)

当您调用Server.Transfer时,当前页面的Response对象将被目标页面的Response对象替换(这将是实际发送给用户的Response )。 因此,如果要设置此特定标头属性,则必须在目标页面上执行此操作。

如果它是有条件的,也许您可​​以使用HttpContext.Items属性,该属性在第一页上设置并在第二页上读取。

此致

答案 1 :(得分:4)

Andre是正确的,Response对象被替换为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() { } } 提取信息并相应地配置标头。这样的事情可能会起到作用......

{{1}}

干杯!

答案 2 :(得分:0)

results.TrySetPropertyValue("ResultIds", alerts.ResultIds); 中添加标题,并且不要更改Source.aspx中的标题。

如果要将结果页面显示为html,则应将标题Destination.aspx page添加为content-type