5

アマゾンウェブサービスCloudFrontのようなHTTP1.0プロキシからのリクエストに対してgzipで圧縮されたコンテンツを提供するようにAzureWebサイトを取得する方法はありますか?次のようなリクエストを検討してください。

curl -I -H "accept-encoding: gzip,deflate,sdch" -H "Via: 1.0 {foo.cdn.net}" -0 http://{fooproject}.azurewebsites.net/

達成するための一般的な方法は、次の要素をに追加することであるようですsystem.webServer

<httpCompression noCompressionForHttp10="false" noCompressionForProxies="false" />

また、これhttpCompressionはでのみ有効ApplicationHost.configあり、web.configAzureWebサイトで上書きできないことを意味するわけではないようです。

回避策の提案はありますか?

追加のリソース:

4

3 に答える 3

1

IIS は HTTP/1.0 要求を圧縮しません。以下を設定することで、この動作をオーバーライドできます。

appcmd set config -section:system.webServer/httpCompression /noCompressionForHttp10:"False"

于 2017-05-12T10:09:50.253 に答える
0

次の 2 つの記事を確認してください。圧縮された (gzip) コンテンツをクライアントに送り返す場合に役立つ可能性があります。

http://christesene.com/mvc-3-action-filters-enable-page-compression-gzip/

http://www.west-wind.com/weblog/posts/2012/Apr/28/GZipDeflate-Compression-in-ASPNET-MVC

于 2013-05-17T14:46:04.240 に答える
0

ジョブを実行する自動魔法の HTTP モジュールを以下に示します。Web.config ファイルに登録する必要があります。

/// <summary>
/// Provides HTTP compression support for CDN services when
/// ASP.NET website is used as origin.
/// </summary>
public sealed class CdnHttpCompressionModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.PreRequestHandlerExecute += Context_PreRequestHandlerExecute;
    }

    public void Dispose()
    {
    }

    void Context_PreRequestHandlerExecute(object sender, EventArgs e)
    {
        var application = (HttpApplication)sender;
        var request = application.Request;
        var response = application.Response;

        // ---------------------------------------------------------------------

        bool allowed = false;

        string via = request.Headers["Via"];
        if (!string.IsNullOrEmpty(via))
        {
            if (via.Contains(".cloudfront.net"))
            {
                // Amazon CloudFront
                allowed = true;
            }

            // HINT: You can extend with other criterias for other CDN providers.
        }

        if (!allowed)
            return;

        // ---------------------------------------------------------------------

        try
        {
            if (request["HTTP_X_MICROSOFTAJAX"] != null)
                return;
        }
        catch (HttpRequestValidationException)
        {
        }

        // ---------------------------------------------------------------------

        string acceptEncoding = request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(acceptEncoding))
            return;

        string fileExtension = request.CurrentExecutionFilePathExtension;
        if (fileExtension == null)
            fileExtension = string.Empty;
        fileExtension = fileExtension.ToLowerInvariant();

        switch (fileExtension)
        {
            case "":
            case ".js":
            case ".htm":
            case ".html":
            case ".css":
            case ".txt":
            case ".ico":
                break;

            default:
                return;
        }

        acceptEncoding = acceptEncoding.ToLowerInvariant();
        string newContentEncoding = null;

        if (acceptEncoding.Contains("gzip"))
        {
            // gzip
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
            newContentEncoding = "gzip";
        }
        else if (acceptEncoding.Contains("deflate"))
        {
            // deflate
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
            newContentEncoding = "deflate";
        }

        if (newContentEncoding != null)
        {
            response.AppendHeader("Content-Encoding", newContentEncoding);
            response.Cache.VaryByHeaders["Accept-Encoding"] = true;
        }
    }
}

このモジュールは、IIS 7.0 以降の統合パイプライン モードで動作するように設計されています (Azure Web サイトでは、そのまま使用できます)。これは最も一般的な構成であるため、通常、接続すると機能します。モジュールは、モジュールのリストの最初のモジュールでなければならないことに注意してください。

Web.config 登録のサンプル:

<configuration>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="CdnHttpCompressionModule" preCondition="managedHandler" type="YourWebsite.Modules.CdnHttpCompressionModule, YourWebsite" />
      <!-- You may have other modules here -->
    </modules>  
  <system.webServer>
</configuration>
于 2013-12-02T01:57:25.437 に答える