4

我有一个页面,根据某些条件,我正在执行 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。

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

4

3 回答 3

6

当你调用 时Server.Transfer,当前页面的 Response 对象将被目标页面的 Response 对象替换(也就是实际发送给用户的 Response)。所以,如果你想设置这个特定的标题属性,你必须在目标页面上进行。

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

问候

于 2012-07-10T16:07:59.617 回答
4

Andre 正确地将 Response 对象替换为Server.Transfer. 如果您想使您正在传输的页面与父级无关,您可能可以将信息输入HttpContext.Items其中,然后使用 anIHttpModule来提取信息并适当地配置标题。像这样的东西可能会完成这项工作......

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

干杯!

于 2012-07-10T16:24:45.873 回答
0

在中添加标题Source.aspx并且不要更改中的标题Destination.aspx page

如果要将结果页面显示为 html,则应将标题添加content-typetext/html

于 2018-11-24T07:21:29.770 回答