2011-12-20 13 views
2

私は、ファイル(CSSテンプレート)を読み込んで内容を変更し、テキスト/ CSSとして提供するhttpハンドラを作成しています。asp.net httpハンドラと動的CSS生成

私はここで見つける例にコードを基づかています:

http://madskristensen.net/post/Remove-whitespace-from-stylesheets-and-JavaScript-files.aspx

コードのビジネスの一部である:

public void ProcessRequest(HttpContext context) 
{ 
    try 
    { 
     string file = context.Request.PhysicalPath; 
     if (!File.Exists(file)) 
      return; 

     string body = string.Empty; 

     if (context.Cache[CSS_CACHE_BODY + file] != null) 
      body = context.Cache[CSS_CACHE_BODY + file].ToString(); 

     if (body == string.Empty) 
     { 
      StreamReader reader = new StreamReader(file); 
      body = reader.ReadToEnd(); 
      reader.Close(); 

      // Modify css template here 
      CacheDependency cd = new CacheDependency(file); 

      context.Cache.Insert(CSS_CACHE_BODY + file, body, cd); 
     } 

     context.Response.ContentType = "text/css"; 
     context.Response.Write(body); 
    } 
    catch (Exception ex) 
    { 
     context.Response.Write(ex.Message); 
    } 
} 

人がefficencyにコメントすることができれば、私は感謝このコードの堅牢性を保証します。私はむしろ、それが何らかの問題を発見する生産環境になるまで待つことはしません!

+1

あなたはたぶん使用してブロックでのStreamReaderを包むこのプロジェクト - http://requestreduce.com/ – MatthewMartin

+0

から対応するソースコードをチェックするかもしれません – DaveHogan

答えて

2

パフォーマンスに関するヒントがいくつかありますが、HTTPヘッダーを使用してクライアント側でレスポンスをキャッシュできます。また、応答を送信する前に、白い領域の除去方法を使用して出力することもできます。別のポイントは圧縮です:ブラウザがサポートしている場合は、応答を圧縮します。

サンプルクライアント側のキャッシュ(VBで)の:

 Dim incomingEtag As String = context.Request.Headers("If-None-Match") 
     Dim freshness As New TimeSpan(100, 0, 0, 0) 
     context.Response.Cache.SetCacheability(HttpCacheability.Public) 
     context.Response.Cache.SetExpires(DateTime.Now.ToUniversalTime.Add(freshness)) 
     context.Response.Cache.SetMaxAge(freshness) 
     context.Response.Cache.SetValidUntilExpires(True) 
     context.Response.Cache.VaryByHeaders("Accept-Encoding") = True 
     context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches) 

     Dim outgoingEtag As String = context.Request.Url.Authority & context.Request.Url.Query.GetHashCode() 
     context.Response.Cache.SetETag(outgoingEtag) 

CSSためホワイトスペースRemovelの機能のサンプル:

Private Function StripWhitespace(ByVal body As String) As String 

     body = body.Replace(" ", " ") 
     body = body.Replace(Environment.NewLine, [String].Empty) 
     body = body.Replace(vbTab, String.Empty) 
     body = body.Replace(" {", "{") 
     body = body.Replace(" :", ":") 
     body = body.Replace(": ", ":") 
     body = body.Replace(", ", ",") 
     body = body.Replace("; ", ";") 
     body = body.Replace(";}", "}") 

     ' sometimes found when retrieving CSS remotely 
     body = body.Replace("?", String.Empty) 

     'body = Regex.Replace(body, @"/\*[^\*]*\*+([^/\*]*\*+)*/", "$1"); 
     body = Regex.Replace(body, "(?<=[>])\s{2,}(?=[<])|(?<=[>])\s{2,}(?=&nbsp;)|(?<=&ndsp;)\s{2,}(?=[<])", [String].Empty) 

     'Remove comments from CSS 
     body = Regex.Replace(body, "/\*[\d\D]*?\*/", String.Empty) 

     Return body 

    End Function 

サンプルホワイトスペースRemovelの機能のためにJS

Private Function StripWhitespace(ByVal body As String) As String 

     Dim lines As String() = body.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries) 
     Dim emptyLines As New StringBuilder() 
     For Each line As String In lines 
      Dim s As String = line.Trim() 
      If s.Length > 0 AndAlso Not s.StartsWith("//") Then 
       emptyLines.AppendLine(s.Trim()) 
      End If 
     Next 

     body = emptyLines.ToString() 
     body = Regex.Replace(body, "^[\s]+|[ \f\r\t\v]+$", [String].Empty) 
     body = Regex.Replace(body, "([+-])\n\1", "$1 $1") 
     body = Regex.Replace(body, "([^+-][+-])\n", "$1") 
     body = Regex.Replace(body, "([^+]) ?(\+)", "$1$2") 
     body = Regex.Replace(body, "(\+) ?([^+])", "$1$2") 
     body = Regex.Replace(body, "([^-]) ?(\-)", "$1$2") 
     body = Regex.Replace(body, "(\-) ?([^-])", "$1$2") 
     body = Regex.Replace(body, "\n([{}()[\],<>/*%&|^!~?:=.;+-])", "$1") 
     body = Regex.Replace(body, "(\W(if|while|for)\([^{]*?\))\n", "$1") 
     body = Regex.Replace(body, "(\W(if|while|for)\([^{]*?\))((if|while|for)\([^{]*?\))\n", "$1$3") 
     body = Regex.Replace(body, "([;}]else)\n", "$1 ") 
     body = Regex.Replace(body, "(?<=[>])\s{2,}(?=[<])|(?<=[>])\s{2,}(?=&nbsp;)|(?<=&ndsp;)\s{2,}(?=[<])", [String].Empty) 

     Return body 

    End Function 
ここ

圧縮にサンプル出力です。

 Dim request As HttpRequest = context.Request 
     Dim response As HttpResponse = context.Response 

     Dim browserAcceptedEncoding As String = request.Headers("Accept-Encoding") 

     If Not String.IsNullOrEmpty(browserAcceptedEncoding) Then 

      browserAcceptedEncoding = browserAcceptedEncoding.ToLowerInvariant 

      If (browserAcceptedEncoding.Contains("gzip")) Then 
       response.AppendHeader("Content-encoding", "gzip") 
       response.Filter = New GZipStream(response.Filter, CompressionMode.Compress) 

      ElseIf (browserAcceptedEncoding.Contains("deflate")) Then 
       response.AppendHeader("Content-encoding", "deflate") 
       response.Filter = New DeflateStream(response.Filter, CompressionMode.Compress) 

      End If 

     End If 
関連する問題