如何在Asp.Net中的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。

为什么会发生这种情况,如何为两种情况设置响应标头相同?

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() { } } 

干杯!

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

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

问候