24

皆さん、私に関する限り、この質問はEDIT 2で回答されています。これは、問題のIIS側の部分的な解決策にすぎませんが、私が探していたものです。


それで、私はこの主題に関する質問の小さな海に私の質問を追加するつもりです。

WCFサービスからの大きな石鹸応答でGZip圧縮を有効にしようとしています。これまで、 IISで動的圧縮を有効にするために、ここや他のさまざまな場所での指示に従いました。これがapplicationHost.configのdynamicTypesセクションです。

<dynamicTypes>
    <add mimeType="text/*" enabled="true" />
    <add mimeType="message/*" enabled="true" />
    <add mimeType="application/x-javascript" enabled="true" />
    <add mimeType="application/atom+xml" enabled="true" />
    <add mimeType="application/xaml+xml" enabled="true" />
    <add mimeType="application/xop+xml" enabled="true" />
    <add mimeType="application/soap+xml" enabled="true" />
    <add mimeType="*/*" enabled="false" />
</dynamicTypes>

そしてまた:

<urlCompression doDynamicCompression="true" doStaticCompression="true" />

なぜそれが必要なのかはよくわかりませんが。

念のため、そこにいくつかの追加のmimeタイプをスローしました。IClientMessageInspectorを実装して、Accept-Encoding:gzipを追加し、クライアントのHttpRequestsにデフレートしました。これは、フィドラーから取得したリクエストヘッダーの例です。

POST http://[omitted]/TestMtomService/TextService.svc HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Accept-Encoding: gzip, deflate
Host: [omitted]
Content-Length: 542
Expect: 100-continue

さて、これは機能しません。メッセージのサイズに関係なく、圧縮は発生しません(1.5Mbまで試行)。私はこの投稿を見ましたが、彼が説明しているように例外に遭遇したことはないので、彼が提案するCodeProjectの実装を試していません。また、これを機能させることになっている他の多くの実装を見てきましたが、それらを理解することはできません(たとえば、msdnのGZipエンコーダー)。エンコーダーまたはコードプロジェクトソリューションを実装する必要があるのはなぜですか?IISが圧縮を処理するべきではありませんか?

では、これを機能させるために他に何をする必要がありますか?

ジョニ

編集:WCFバインディングは投稿する価値があるかもしれないと思いましたが、それらが関連しているかどうかはわかりません(これらはクライアントからのものです):

<system.serviceModel>
<bindings>
    <wsHttpBinding>
    <binding name="WsTextBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
      receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false"
      transactionFlow="false" hostNameComparisonMode="StrongWildcard"
      maxBufferPoolSize="5000000" maxReceivedMessageSize="5000000"
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
      allowCookies="false">
      <readerQuotas maxDepth="32" maxStringContentLength="5000000"
        maxArrayLength="5000000" maxBytesPerRead="5000000" maxNameTableCharCount="5000000" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00"
        enabled="false" />
      <security mode="None">
        <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
        <message clientCredentialType="None" negotiateServiceCredential="false"
          algorithmSuite="Default" establishSecurityContext="false" />
      </security>
<client>
  <endpoint address="http://[omitted]/TestMtomService/TextService.svc"
   binding="wsHttpBinding" bindingConfiguration="WsTextBinding" behaviorConfiguration="GzipCompressionBehavior"
   contract="TestMtomModel.ICustomerService" name="WsTextEndpoint">
  </endpoint>
</client>
<behaviors>
  <endpointBehaviors>
    <behavior name="GzipCompressionBehavior">
      <gzipCompression />
    </behavior>
  </endpointBehaviors>
</behaviors>
<extensions>
  <behaviorExtensions>
    <add name="gzipCompression"
         type="TestMtomModel.Behavior.GzipCompressionBehaviorExtensionElement, TestMtomModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </behaviorExtensions>
</extensions>
    </binding>
  </wsHttpBinding>
</bindings>

編集2:この不思議な状況にいる他の人にとっては、部分的な解決策があります。つまり、IIS7で少なくともサービスからのsoapメッセージを圧縮するようになりました(クライアントで例外が発生しましたが、そのためにいくつかの解決策が投稿されています)。問題は、DynamicCompressionModuleがサーバーにインストールされていないことでした。実際に「インストール」するということは、私にとっては、単にこの行をapplicationHost.configのセクションに追加することを意味します。

<add name="DynamicCompressionModule" image="%windir%\System32\inetsrv\compdyn.dll" />

(dllがそのディレクトリに存在すると仮定します。私の場合は存在します。)次に、WebサイトまたはサーバーのIIS7の[モジュール]セクションからモジュールを追加します。

4

8 に答える 8

14

「application/soap+xml;」を追加してみてください。applicationHost の動的タイプとして charset=utf-8'。この文字セット部分を追加すると、http ハンドラーからの一部の JSON 応答の圧縮を有効にするのに役立ちました。

于 2010-06-16T05:34:15.663 に答える
10

これは基本的に@markoと同じ答えですが、詳細な手順があります。これは、再訪するたびに苛立たしいトピックであるため、それを機能させるために必要なすべてのことを概説したいと思いました。

  • まず最初に、IIS7で.NET4を使用する必要があります。これは、WCFがgzipストリームを自動的に解凍できるようになったのは.NET4までではなかったためです。この詳細は、「WCF 4の新機能」(フィードバックのいくつかの有用なコメント)で説明されています。

    クライアントがgzipを使用して自動的にネゴシエートするか、圧縮されたストリームを圧縮解除してから自動的に解凍できるようにすることで、HTTPを使用する際の作業が簡単になりました。

  • 次に、IISで動的圧縮モジュールが有効になっていることを確認します。あなたはそれをインストールするために「プログラムと機能」に行く必要があるかもしれません。これはグローバル設定ではないため、問題のWebアプリケーションに対して有効になっていることを確認してください。

  • 現在、WPFはHTTP送信にMIMEタイプapplication/soap+xml; charset=utf-8を使用しています(少なくともwsHttpBindingでは使用されます)。デフォルトでは、これは動的タイプとして分類されないため、applicationHost.configファイルに追加する必要があります。

    サーバーで次のファイルを編集するだけです:C:\ Windows \ System32 \ Inetsrv \ Config \ applicationHost.config

    ノードに次の行を追加し<dynamicTypes>ます(BEFORE THE / LINE):

    <add mimeType="application/soap+xml; charset=utf-8" enabled="true" />
    

    applicationHost.configファイルの詳細

  • IISを再起動します

これで圧縮データができたはずです。これはFiddlerで確認できます。

于 2010-09-14T03:29:12.343 に答える
1

私もこれに苦労しており、同じアプリ内の.aspxファイルでは問題ありませんでしたが、.svcで動作させることができませんでした. wsHttpBindingまたはバイナリ エンコードされたcustomBindingではなく、 basicHttpBindingでのみ機能することが判明しました。これは、圧縮係数がバイナリ エンコーダーの利点を上回るため、私にとっては問題ありません (これにより、メッセージ サイズが大幅に縮小されますが、圧縮によって得られる 10 分の 1 にはなりません)。

于 2011-03-02T13:28:31.087 に答える
0

mimeタイプが最も可能性が高いApplication/octet-stream

于 2011-08-26T12:20:11.933 に答える
0

多くの人が、WCF サービスで IIS レベルの圧縮を有効にすることに苦労しています。主に wsHttpBinding に苦労しています。IIS で動的圧縮が有効になっている場合、basicHttpBinding はすぐに圧縮できます。動的圧縮を有効にする方法については、さまざまな投稿で取り上げられているため、ここでは説明しません。 "iis compression application/soap+xml"を検索してください。前述のように、すべてを適切に構成した場合、Content-Encoding: gzip で圧縮された WCF 応答を確認できるはずです。応答ヘッダーで。Fiddler を使用してリクエスト/レスポンスを追跡することをお勧めします。これは、basicHttpBinding に関する私の (他の多くの) 経験でした。問題は、なぜ wsHttpBinding で機能しないのかということです。間違いなく、これら 2 つのバインディング間でContent-Typeが異なるためであることを既にお読みになったことでしょう。basicHttpBinding はContent-Type: text/xml を使用します。charset=utf-8ここで wsHttpBinding はContent-Type を使用します: application/soap+xml; 文字セット=utf-8. 前者は、dynamicTypes の下の既定の IIS applicationHost.config 設定によってカバーされます。後者はそうではありません。おそらく、この追加の mimeType を追加し、IIS を再起動してこれを修正する必要があることを読んだことでしょう。これは一部の人には有効ですが、多くの人には有効ではありません。単純に wsHttpBinding と互換性がないと宣言する人もいます。これが問題です。次の 2 つのapplicationHost.config ファイルが存在する可能性があります。

C:\Windows\System32\inetsrv\config
C:\Windows\SysWOW64\inetsrv\Config

System32 は 64 ビットのもので、IIS のインストールで使用されます。これは、追加の mimeType を追加するために変更したものでもあります。

applicationhost.config を手動で編集できない - 必読

結局のところ、Notepad++ などの 32 ビット アプリケーションを使用する場合、最終的に変更するのは SysWOW64 フォルダー内のファイルです。これは完全に透過的です。通常のメモ帳アプリケーションを使用すると、追加した mimeType が実際には System32 フォルダーにあるファイルにはなく、実際に参照したことがなくても、魔法のように SysWOW64 フォルダーに追加されていることに気付くでしょう。はじめるフォルダ。うまくいけば、これで何時間もの悲しみが救われます。

于 2015-09-16T14:57:35.330 に答える
0

最善の策は、問題が発生している特定の MIME タイプ (Fiddler など) を評価し、それが applicationHost.config に組み込まれていることを確認することです。圧縮が正しくインストールされ、構成されている場合、失敗した要求のトレースにより、「NO_MATCHING_CONTENT_TYPE」の性質で圧縮が実行されなかったことがわかります。

于 2010-06-16T17:15:25.677 に答える