【问题标题】:Add ServiceHost extension by code通过代码添加 ServiceHost 扩展
【发布时间】:2012-07-26 23:15:11
【问题描述】:

我将这个 XML 截断为 App.config,而我是 found here

<?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>
...

出于某些原因,我不想对程序集进行硬编码,也不想为此使用 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 崩溃。有什么想法吗?

【问题讨论】:

标签: wcf web-services webhttpbinding


【解决方案1】:

这种方式是行不通的。 WebHttpBinding 永远不会使用您的绑定元素。配置文件中的BindingElementExtensions 只是定义了新元素,这些元素可用于在配置文件中定义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);

【讨论】:

  • 目前我开发了一个非常相似的代码,但是在调试我的整个 Visual Studio 崩溃时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
相关资源
最近更新 更多