How to set Response Header before Server.Transfer in Asp.Net?

走远了吗. 提交于 2019-12-01 04:15:21

问题


I have a page where based on certain conditions I am either doing a Response.Redirect or Server.Transfer. Now I want to add a header for both the cases. So I am doing the following

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

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

Now, when the code goes via Server.Transfer code path, the Vary header is set to * whereas when it goes via Response.Redirect the header is correctly set to User-Agent.

Why does this happen and how can I set the Response Header to be same for both the cases?


回答1:


Andre is right that the Response object is replaced as part of Server.Transfer. If you want to make the page you're transferring to agnostic of the parent you can probably whack the information into HttpContext.Items and then use an IHttpModule to extract the information and configure the header appropriately. Something like this would probably do the job...

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

Cheers!




回答2:


when you call Server.Transfer, the Response object of the current page will be replaced by the Response object of the target page (which is the Response that will actually be sent to the user). So, if you want to set this specific header attribute, you must do it on the target page.

If it's conditional, maybe you can use a HttpContext.Items property, that is set on the first page and read on the second.

Regards




回答3:


Add header in Source.aspx and don't Change the header in Destination.aspx page.

If you want to display the result page as html then you should add header content-type as text/html



来源:https://stackoverflow.com/questions/11417355/how-to-set-response-header-before-server-transfer-in-asp-net

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!