在实施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服务,甚至不在客户端应用程序中运行。
我错过了什么?