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は、最初のページで設定され、2 番目のページで読み取られるプロパティを使用できます。

よろしく

于 2012-07-10T16:07:59.617 に答える
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()
    {
    }
}

乾杯!

于 2012-07-10T16:24:45.873 に答える