Wcf 按代码添加ServiceHost扩展

Wcf 按代码添加ServiceHost扩展,wcf,web-services,webhttpbinding,Wcf,Web Services,Webhttpbinding,我截取了一个App.config的XML,我: 但最后一行行不通,我该怎么解决?我认为通过代码实现这一点是可能的 目前,我几乎找到了一个解决方案。当我尝试使用JSONSerialistor时,我遇到了一个问题,但是我现在使用这个绑定: CustomBinding cb = new CustomBinding(binding); MessageEncodingBindingElement inner = (MessageEncodingBindingElement)cb.Elements.ToA

我截取了一个
App.config
的XML,我:

但最后一行行不通,我该怎么解决?我认为通过代码实现这一点是可能的


目前,我几乎找到了一个解决方案。当我尝试使用JSONSerialistor时,我遇到了一个问题,但是我现在使用这个绑定:

CustomBinding cb = new CustomBinding(binding);
MessageEncodingBindingElement inner = (MessageEncodingBindingElement)cb.Elements.ToArray()[0];
cb.Elements.RemoveAt(0);
cb.Elements.Insert(0, new GZipMessageEncodingBindingElement(inner));
gzimpessageencoder
稍作修改,使压缩成为可选的:

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;
    }
}
public-override-ArraySegment-WriteMessage(消息消息消息、int-maxMessageSize、BufferManager-BufferManager、int-messageOffset){
var req=WebOperationContext.Current.IncomingRequest;
var encoding=req.Headers[HttpRequestHeader.AcceptEncoding];//调试时崩溃
//使用内部编码器将消息编码到缓冲字节数组中
ArraySegment buffer=innerEncoder.WriteMessage(message,maxMessageSize,bufferManager,0);
if(encoding!=null&&encoding.ToLower()包含(“gzip”)){
WebOperationContext.Current.OutgoingResponse.Headers[HttpResponseHeader.ContentEncoding]=“gzip”;
WebOperationContext.Current.OutgoingRequest.Headers[HttpResponseHeader.ContentEncoding]=“gzip”;
//压缩生成的字节数组
返回CompressBuffer(buffer、bufferManager、messageOffset);
}否则{
返回缓冲区;
}
}

但我的代码让visual studio在标记行中调试时崩溃。有什么想法吗?

这样不行
WebHttpBinding
永远不会使用您的绑定元素<配置文件中的code>BindingElementExtensions仅定义可用于在配置文件中定义
CutomBinding
的新元素。如果需要在代码中执行此操作,只需创建一个新的
CustomBinding
实例,并用您想要使用的绑定元素(从
BindingElement
派生的类)填充它-您将使用
gzimpessageencodingbindingElement
。链接的示例也描述了该代码:

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);
ICollection bindingElements=new List();
HttpTransportBindingElement httpBindingElement=新的HttpTransportBindingElement();
GZipMessageEncodingBindingElement compBindingElement=新的GZipMessageEncodingBindingElement();
添加(compBindingElement);
添加(httpBindingElement);
CustomBinding=新的CustomBinding(bindingElements);

看起来像是类似的问题当前我开发了一个非常类似的代码,但在调试整个visual studio时崩溃了。
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;
    }
}
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);