皆さん、私に関する限り、この質問は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の[モジュール]セクションからモジュールを追加します。