2009-07-06 22 views
0

1)私のすべてのコントローラでこれらの属性を使用するのは悪い習慣ではありませんか?Asp.NET MVC:練習問題

[HandleError] 
[CompressFilter(Order = 1)] 

圧縮フィルタは次のように定義されます

public class CompressFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (!AppConfig.IsResponseCompressionEnabled) { 
      base.OnActionExecuting(filterContext); 
      return; 
     } 
     HttpRequestBase request = filterContext.HttpContext.Request; 

     string acceptEncoding = request.Headers["Accept-Encoding"]; 

     if (string.IsNullOrEmpty(acceptEncoding)) return; 

     acceptEncoding = acceptEncoding.ToUpperInvariant(); 

     HttpResponseBase response = filterContext.HttpContext.Response; 

     if (acceptEncoding.Contains("GZIP")) { 
      response.AppendHeader("Content-encoding", "gzip"); 
      response.Filter = new GZipStream(response.Filter, CompressionMode.Compress); 
     } 
     else if (acceptEncoding.Contains("DEFLATE")) { 
      response.AppendHeader("Content-encoding", "deflate"); 
      response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress); 
     } 
    } 
} 

2)私は、Ajaxを使用して、クライアントから一部のサーバー機能を呼び出すために必要がある場合はどのような。 このようなタスクのために特別なコントローラ(WebServiceControllerという名前)を1つ作成することをお勧めしますか?私はすべてのあなたのコントローラ上で、[のHandleError]属性を使用してに何か問題が表示されていない

+0

IISで設定されたgzipで圧縮フィルタを使用する利点は何ですか? – redsquare

答えて

1

質問1

。処理されているアクションまたは結果からスローされた未処理の例外を捕捉できるようにします。

[CompressFilter]属性は多少複雑ですが、ほとんどのHTMLまたはテキストベースの応答では、大量の圧縮を取得できるはずです。添付ファイルのようなバイナリファイルで応答する場合、その属性を使用したくないかもしれません。最後に、十分なトラフィックが得られるまで待って、圧縮の利点がコストを上回るかどうかを確認します。

質問2

一般的にはあなただけのAJAXリクエストを処理するコントローラを持っている必要はありません。 AJAX呼び出しで要求されているリソースに最も適したコントローラを使用します。

あなたのコントローラーがコンストラクターで何らかの高価な設定をしている場合は、AJAX呼び出しを処理する別のコントローラーを設定することができます。

+0

質問1について - 私にとって、何度も何度も繰り返す必要はありませんか? –

+0

@ samuelcarrijo私の答えをチェックしてください。役立つかもしれません。 –

+0

私はちょうど興味があります - 高価なセットアップコントローラはどんな種類ですか? –

1
  1. 私はすべてのアクションに適用するのではなく、コントローラにフィルタを適用します。
    ALLアクション(それは例外のための別のフィルタの作成を必要とするかもしれません) - there areアプリケーションに幅広く適用するテクニックが必要な場合(継承を通じてコン​​トローラに指定されたフィルタを適用することをお勧めします)

    私はこの問題を解決する方法がたくさんあると思います。ニーズに合った正しいものを見つけるのは難しいです。

  2. コントローラにアクションを書き込むことをお勧めします。コントローラーには、
    (つまり、プロダクトコントローラーのGetProductByIdAsJson)と指定し、必要に応じて部分的な要求かどうかを確認してください。

フィルタは一般的ではありません。私にとっては大きな欠点です。