WCF Web服务无法使用来自wsHttpBinding的HTTPS的GZipMessageEncoding

时间:2016-04-02 11:15:49

标签: c# .net wcf gzip

在实施gzip之前,我的客户端&服务器解决方案与wsHttpBinding一起使用,使用kerberos(SPN)和HTTPS。在发现传输的数据很大之后,我决定使用IIS压缩。但我了解到IIS只会压缩响应,而不是来自客户端的请求。所以,决定尝试gzip消息编码。

我已经通过引用Microsoft网站为wcf web服务实现了gzip压缩。如果我在没有HTTPS的NTLM下运行,一切正常。但我无法使用Kerberos和HTTPS运行它。

下面是来自GZipCompressionCustomBinding的C#编码继承自CustomBinding。

public override BindingElementCollection CreateBindingElements()
{
    GZipMessageEncodingBindingElement gzipElement;
    TextMessageEncodingBindingElement textMessageEncodingBindingElement = new TextMessageEncodingBindingElement();
    gzipElement = new GZipMessageEncodingBindingElement(textMessageEncodingBindingElement);

    // Copy from existing HTTPS setting from wsHttpBinding.
    WSHttpBinding wSHttpBinding = new WSHttpBinding("RMSBinding_HTTPS");
    BindingElementCollection wSHttpBindingElementCollection = wSHttpBinding.CreateBindingElements();

    HttpsTransportBindingElement transportElement = wSHttpBindingElementCollection.Remove<HttpsTransportBindingElement>();
    TextMessageEncodingBindingElement textElement = wSHttpBindingElementCollection.Remove<TextMessageEncodingBindingElement>();

    wSHttpBindingElementCollection.Add(gzipElement);
    wSHttpBindingElementCollection.Add(transportElement);

    return wSHttpBindingElementCollection;        
}

原因我做上述编码从wsHttpBinding复制的是,我需要大多数类似于带安全模型的wsHttpBinding的安全配置是TransportWithMessageCredential而clientCredentialType是Windows。

以下是来自wcf web服务的web.config和来自客户端应用程序的app.config。

<wsHttpBinding>
<binding
  name="RMSBinding_HTTPS"
  closeTimeout="00:10:00"
  openTimeout="00:10:00"
  receiveTimeout="00:10:00"
  sendTimeout="00:10:00"
  bypassProxyOnLocal="false"
  transactionFlow="false"
  hostNameComparisonMode="StrongWildcard"
  maxBufferPoolSize="2147483646"
  maxReceivedMessageSize="2147483646"
  messageEncoding="Text"
  textEncoding="utf-8"
  useDefaultWebProxy="true"
  allowCookies="true">

  <readerQuotas
    maxDepth="2147483646"
    maxStringContentLength="2147483646"
    maxArrayLength="2147483646"
    maxBytesPerRead="2147483646"
    maxNameTableCharCount="2147483646" />

  <security mode="TransportWithMessageCredential">
    <transport
      clientCredentialType="Windows" />
    <message
      clientCredentialType="Windows"
      negotiateServiceCredential="true"
      establishSecurityContext="false" />
  </security>
</binding>
</wsHttpBinding>

我在IE浏览到我的网络服务时遇到了这个错误:

  

提供的URI方案&#39; http&#39;是无效的;预期&#39; https&#39;。   参数名称:context.ListenUriBaseAddress

在Stack Trace中,我看到了这一行: CustomBindingElements \ GZipMessageEncodingBindingElement.cs行:166

我进一步研究上面提到的编码:

    public override IChannelListener<TChannel> BuildChannelListener<TChannel>(BindingContext context)
    {
        if (context == null)
            throw new ArgumentNullException("context");

        context.BindingParameters.Add(this);
        return context.BuildInnerChannelListener<TChannel>();
    }

我进入调试这一行并意识到,context.ListenUriBaseAddress中的Web服务地址实际上是http://xxxx.svc 我不知道为什么这是http,即使我只是在IE中运行Web服务,甚至不在客户端应用程序中运行。

我错过了什么?

0 个答案:

没有答案