コードでServiceHost拡張機能を追加します
-
13-12-2019 - |
質問
このXMLがApp.config
を鳴らしているここに見つかりました:
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="gzipMessageEncoding" type="Microsoft.Samples.GZipEncoder.GZipMessageEncodingElement, GZipEncoder, Version=4.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bindingElementExtensions>
</extensions>
...
.
いくつかの理由で、私はASEMBLYをハードコードしたくないため、XMLファイルを使用したくありません。
彼の陰謀的にこのコードを使います:
Uri baseAddress = new Uri("http://localhost:80/Test");
WebHttpBinding binding = new WebHttpBinding(
WebHttpSecurityMode.TransportCredentialOnly);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
ServiceHost host = new ServiceHost(typeof(ExampleWebService), baseAddress);
host.Extensions.Add(new GZipMessageEncodingElement());
.
しかし最後の行は動作しないのにどのように修正することができますか?コードでそれをすることが可能でなければならないと思います。
彼の間に私はほとんど解決策を見つけました私はJSonSerialisatorを使いようとしたときに問題があるほとんど問題がありましたが、このバインディングを今使用します。
CustomBinding cb = new CustomBinding(binding);
MessageEncodingBindingElement inner = (MessageEncodingBindingElement)cb.Elements.ToArray()[0];
cb.Elements.RemoveAt(0);
cb.Elements.Insert(0, new GZipMessageEncodingBindingElement(inner));
.
GZipMessageEncoder
は圧縮視野を作るために少し変更されています:
public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset) {
var req = WebOperationContext.Current.IncomingRequest;
var encoding=req.Headers[HttpRequestHeader.AcceptEncoding]; // crash while debug
//Use the inner encoder to encode a Message into a buffered byte array
ArraySegment<byte> buffer = innerEncoder.WriteMessage(message, maxMessageSize, bufferManager, 0);
if(encoding != null && encoding.ToLower().Contains("gzip")) {
WebOperationContext.Current.OutgoingResponse.Headers[HttpResponseHeader.ContentEncoding] = "gzip";
WebOperationContext.Current.OutgoingRequest.Headers[HttpResponseHeader.ContentEncoding] = "gzip";
//Compress the resulting byte array
return CompressBuffer(buffer, bufferManager, messageOffset);
} else {
return buffer;
}
}
.
しかし、マークされた行でデバッグしながら、私のコードをVisual Studioにクラッシュさせましょう。任意のアイデア?
解決
このようには機能しません。WebHttpBinding
はあなたのバインディング要素を使用しません。Configurationファイル内のBindingElementExtensions
は、Configファイル内のCutomBinding
を定義するために使用できる新しい要素を定義します。コード内でそれをする必要がある場合は、CustomBinding
の新しいインスタンスを作成し、使用するバインディング要素(BindingElement
から派生したクラス)で記入します。 - GZipMessageEncodingBindingElement
を使用します。リンクされているサンプルはそのコードも説明しています:
ICollection<BindingElement> bindingElements = new List<BindingElement>();
HttpTransportBindingElement httpBindingElement = new HttpTransportBindingElement();
GZipMessageEncodingBindingElement compBindingElement = new GZipMessageEncodingBindingElement ();
bindingElements.Add(compBindingElement);
bindingElements.Add(httpBindingElement);
CustomBinding binding = new CustomBinding(bindingElements);
. 所属していません StackOverflow