1

ベースコントローラーでRedirectPermanent(url)メソッドを使用すると、MVC3アプリケーションでこのエラーが発生します。他のStackOverflowの回答で示唆されているように、出力をバッファリングしても効果はありません。

protected void Application_BeginRequest(object sender, EventArgs e)
{
   Context.Response.BufferOutput = true;
}

リダイレクトは、次のWebサイトのデフォルトコントローラーでの最初のアクション結果としてトリガーされます: http ://www.autoquoter.com

ヘッダーを直接追加するコードはありません。その場合、応答ヘッダーを追加しているものを判別する方法はありますか?

これは、Webサイトの最初のページのWebkitのデバッガーからのネットワークログです。

Request URL:http://www.autoquoter.com/
Request Method:GET
Status Code:301 Moved Permanently

Request Headers
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2

Response Headers
Cache-Control:no-cache, no-store, must-revalidate
Content-Length:128
Content-Type:text/html; charset=utf-8
Date:Thu, 21 Mar 2013 17:10:38 GMT
Expires:-1
Location:/aq/en/Home
Pragma:no-cache
Server:Microsoft-IIS/6.0
X-AspNet-Version:4.0.30319
X-AspNetMvc-Version:3.0
X-Powered-By:ASP.NET
4

1 に答える 1

2

これで解決したようです。NoCacheAttribute フィルター内に埋め込まれたホスト名に基づく別のリダイレクトがありました。これは、OnResultExecuting メソッドで Response オブジェクトのプロパティを設定していました。

メソッドの名前を OnActionExecuting に変更して、より早くトリガーされるようにし、手動リダイレクトを RedirectResult に置き換えました。また、既にリダイレクトしている場合は、キャッシュ設定を更新しないようになりました。

前:

 if (currentHost != prefHost && filterContext.HttpContext.Response.StatusCode != 301)
 {
      var Url = filterContext.HttpContext.Request.Url.Scheme + "://" + prefHost + filterContext.HttpContext.Request.Url.PathAndQuery;
      filterContext.HttpContext.Response.StatusCode = 301;
      filterContext.HttpContext.Response.RedirectLocation = Url;
      filterContext.HttpContext.Response.End();
      return;
 }
 filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); 
 filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false); 
 filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
 filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
 filterContext.HttpContext.Response.Cache.SetNoStore(); 

後:

 if (currentHost != prefHost && filterContext.HttpContext.Response.StatusCode != 301)
 {
      var Url = filterContext.HttpContext.Request.Url.Scheme + "://" + prefHost + filterContext.HttpContext.Request.Url.PathAndQuery;
      filterContext.Result = new RedirectResult(Url, true);
      disableCache = false;
 }


    if (disableCache)
    {
        filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
        filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.SetNoStore();
    }
    base.OnActionExecuting(filterContext);
于 2013-03-21T18:36:11.713 に答える