我有一个页面,根据某些条件,我正在执行 Response.Redirect 或 Server.Transfer。现在我想为这两种情况添加一个标题。所以我正在做以下事情

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

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

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

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

最佳答案

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

干杯!

关于c# - 如何在 Asp.Net 中的 Server.Transfer 之前设置响应头?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11417355/

10-08 22:39