C#.NET WCF WebサービスでGZIP圧縮を有効にするのに問題があり、App.conf構成ファイルに何が欠けているか、またはでWebサービスを開始するために呼び出しを行うときに追加が必要なものを誰かが知っていることを期待していましたコード。
GZIPを追加するMicrosoftの例のダウンロードを指すリンク「ApplyingGZIPCompressionto WCF Services」をたどりましたが、この例はWebサービスの設定方法とは相関していません。
だから私のApp.confは次のようになります
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<services>
<service name="MyService.Service1">
<endpoint address="http://localhost:8080/webservice" binding="webHttpBinding" contract="MyServiceContract.IService"/>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior>
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<extensions>
<bindingElementExtensions>
<add name="gzipMessageEncoding" type="MyServiceHost.GZipMessageEncodingElement, MyServiceHost, Version=4.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bindingElementExtensions>
</extensions>
<protocolMapping>
<add scheme="http" binding="customBinding" />
</protocolMapping>
<bindings>
<customBinding>
<binding>
<gzipMessageEncoding innerMessageEncoding="textMessageEncoding"/>
<httpTransport hostNameComparisonMode="StrongWildcard" manualAddressing="False" maxReceivedMessageSize="65536" authenticationScheme="Anonymous" bypassProxyOnLocal="False" realm="" useDefaultWebProxy="True"/>
</binding>
</customBinding>
</bindings>
</system.serviceModel>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>
</configuration>
構成クラスとGZIPクラスをMSの例からプロジェクトにコピーし、関連するWebサービス構成を追加しただけです。Windowsサービスを開始するために使用しているコードは次のとおりです。
WebServiceHost webserviceHost = new WebServiceHost(typeof(MyService.Service1));
webserviceHost.Open();
Webサービスは正常に実行されますが、Fiddlerは、Webブラウザーから呼び出しを行うときに、GZIP圧縮で返される応答を検出しません。また、プログラムでGZIPを使用してWebサービスをセットアップして実行しようとしましたが、惨めに失敗しました。緑なので、他に何を設定する必要があるのかわかりません。アドバイスは素晴らしいです。
これをさらに深く掘り下げてみると、WebサービスをWebServiceHostオブジェクトとして実行しているため、app.confファイルのカスタムGZIPバインディングを、WebServiceHostのデフォルトのWebHTTPBindingオブジェクトでオーバーライドする必要があることがわかりました。 Webサービスからはエンコードされません。これを回避するために、カスタムGZIPバインディングをプログラムでコードに書き込むことにしました。
var serviceType = typeof(Service1);
var serviceUri = new Uri("http://localhost:8080/webservice");
var webserviceHost = new WebServiceHost(serviceType, serviceUri);
CustomBinding binding = new CustomBinding(new GZipMessageEncodingBindingElement(), new HttpTransportBindingElement());
var serviceEndPoint = webserviceHost.AddServiceEndpoint(typeof(IService), binding, "endpoint");
webserviceHost.Description.Endpoints[0].Behaviors.Add(new WebHttpBehavior { HelpEnabled = true });
webserviceHost.Open();
問題は、WebHttpBehaviorとのカスタムバインディングが許可されないことです。しかし、この動作を削除すると、REST Webサービスが醜くなり、コントラクトの入力としてStreamオブジェクトが期待されます。動作を構成する方法がわからないので、どんな助けも素晴らしいです。