C# 如何将gzip MessageEncoding bindingElementExtension添加到现有的WCF/WSDL应用程序中?
我正试图将gzip压缩消息编码器从包中放入现有的WCF/WSDL应用程序(使用C# 如何将gzip MessageEncoding bindingElementExtension添加到现有的WCF/WSDL应用程序中?,c#,.net,wcf,wsdl,C#,.net,Wcf,Wsdl,我正试图将gzip压缩消息编码器从包中放入现有的WCF/WSDL应用程序(使用basicHttpBinding),但应用程序配置有问题 我将GZipEncoder项目从示例添加到解决方案中(包含GZipMessageEncoderFactory、GZipMessageEncodingBindingElement和GZipMessageEncodingBindingElementImporter),然后将扩展添加到Web.config的serviceModel/extensions(完整的最终We
basicHttpBinding
),但应用程序配置有问题
我将GZipEncoder项目从示例添加到解决方案中(包含GZipMessageEncoderFactory、GZipMessageEncodingBindingElement和GZipMessageEncodingBindingElementImporter),然后将扩展添加到Web.config的serviceModel/extensions
(完整的最终Web.config位于我问题的底部):
解析器无法识别gzimpessageencoding
,因此我在serviceModel/bindings
中将basicHttpBinding替换为自定义绑定:
<customBinding>
<binding name="customBinding" closeTimeout="00:15:00" openTimeout="00:15:00" receiveTimeout="00:15:00" sendTimeout="00:15:00">
<gzipMessageEncoding innerMessageEncoding="textMessageEncoding"/>
<httpTransport hostNameComparisonMode="StrongWildcard" manualAddressing="False" maxReceivedMessageSize="2147483647"
authenticationScheme="Anonymous" bypassProxyOnLocal="False" realm="" useDefaultWebProxy="True" transferMode="Buffered"/>
</binding>
</customBinding>
然后在我的端点中将customBinding命名为:
<service behaviorConfiguration="KiProjectsSyncServiceBehavior" name="KiProjectsSyncService">
<endpoint address="" binding="customBinding" bindingConfiguration="KiProjectsSyncService" contract="IKiProjectsSyncService"/>
但是,当我浏览到该服务时,会出现错误:
system.serviceModel/bindings/customBinding上的绑定不可用
已配置名为“KiProjectsSyncService”的绑定。这是一个
bindingConfiguration的值无效
我只想将gzip附加到basicHttp或其他一些简单的文本绑定。这个示例似乎做到了这一点,但我看不出我在哪里偏离了它的示例。理解这个配置会很好,因为这个功能将来需要适应各种环境,我决定不使用REST的原因之一就是这个架构的灵活性
仅供参考:我想要双向压缩,我相信在IIS中打开压缩只会压缩下载。我的应用程序是两个相互通信的IIS服务器ASP应用程序。我通过接口传输DataContract和MessageContract类型(后者用于双向流文件,尽管在我使用BasicHttp时它们实际上是缓冲的)。这一切都很好-只是努力增加压缩。我还修改了客户机web.config(bindingElementExtensions、endPoint bindingConfig和binding、policyImporters和customBinding),但我只是试图浏览到我的.svc服务,而不涉及客户机
完整web.config:
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="KiSuiteConnectionString" connectionString="Data Source=xxxx;Initial Catalog=xxxx;Persist Security Info=True;User ID=xxxx;Password=xxxx" providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
<add key="webpages:Enabled" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0"/>
<httpRuntime executionTimeout="999999" maxRequestLength="2147483647" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2147483647" />
</requestFiltering>
</security>
</system.webServer>
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="gzipMessageEncoding" type="Microsoft.Samples.GZipEncoder.GZipMessageEncodingElement, GZipEncoder, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</bindingElementExtensions>
</extensions>
<protocolMapping>
<add scheme="http" binding="customBinding" />
</protocolMapping>
<bindings>
<customBinding>
<binding name="customBinding" closeTimeout="00:15:00" openTimeout="00:15:00" receiveTimeout="00:15:00" sendTimeout="00:15:00">
<gzipMessageEncoding innerMessageEncoding="textMessageEncoding"/>
<httpTransport hostNameComparisonMode="StrongWildcard" manualAddressing="False" maxReceivedMessageSize="2147483647"
authenticationScheme="Anonymous" bypassProxyOnLocal="False" realm="" useDefaultWebProxy="True" transferMode="Buffered"/>
</binding>
</customBinding>
</bindings>
<services>
<service behaviorConfiguration="KiProjectsSyncServiceBehavior" name="KiProjectsSyncService">
<endpoint address="" binding="customBinding" bindingConfiguration="KiProjectsSyncService" contract="IKiProjectsSyncService"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="KiProjectsSyncServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" maxConcurrentInstances="500"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
</system.serviceModel>
</configuration>
我唯一的错误是,
端点
绑定配置
必须设置为与绑定相同的值(在我的情况下,customBinding
),即:
我认为bindingConfiguration设置可以用于向WCF框架插入新的定制。然后在client web.config中,我必须添加以下内容:
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="gzipMessageEncoding" type="Kimetrica.Sync.GZipEncoder.GZipMessageEncodingElement, GZipEncoder, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</bindingElementExtensions>
</extensions>
<bindings>
<customBinding>
<binding name="customBinding" closeTimeout="00:15:00" openTimeout="00:15:00"
receiveTimeout="00:15:00" sendTimeout="00:15:00">
<gzipMessageEncoding innerMessageEncoding="textMessageEncoding" />
<httpTransport manualAddressing="false" authenticationScheme="Anonymous"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
proxyAuthenticationScheme="Anonymous" realm="" useDefaultWebProxy="true" maxReceivedMessageSize="2147483647" transferMode="Buffered" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="http://localhost:1062/WcfTestWebSite/KiProjectsSyncService.svc"
binding="customBinding" bindingConfiguration="customBinding"
contract="KiProjectsSyncServiceReference.IKiProjectsSyncService" name="KiProjectsSyncService" />
<metadata>
<policyImporters>
<extension type="Microsoft.Samples.GZipEncoder.GZipMessageEncodingBindingElementImporter, GZipEncoder, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</policyImporters>
</metadata>
</client>
</system.serviceModel>
这成功地添加了gzip压缩,并将包含文件流的DataContracts和MessageContracts(包括超过默认64kb的限制)、IIS ASP应用程序发送到IIS ASP应用程序。我想我已经修复了它(现在正在处理客户端配置)。在端点
中,绑定配置
必须与绑定
相同,即自定义绑定
。服务现在似乎出现在浏览器中,但尚未与客户端连接。当我把这个发出去的时候,我会发帖的。
<service behaviorConfiguration="KiProjectsSyncServiceBehavior" name="KiProjectsSyncService">
<endpoint address="" binding="customBinding" bindingConfiguration="KiProjectsSyncService" contract="IKiProjectsSyncService"/>
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="KiSuiteConnectionString" connectionString="Data Source=xxxx;Initial Catalog=xxxx;Persist Security Info=True;User ID=xxxx;Password=xxxx" providerName="System.Data.SqlClient" />
</connectionStrings>
<appSettings>
<add key="webpages:Enabled" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0"/>
<httpRuntime executionTimeout="999999" maxRequestLength="2147483647" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2147483647" />
</requestFiltering>
</security>
</system.webServer>
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="gzipMessageEncoding" type="Microsoft.Samples.GZipEncoder.GZipMessageEncodingElement, GZipEncoder, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</bindingElementExtensions>
</extensions>
<protocolMapping>
<add scheme="http" binding="customBinding" />
</protocolMapping>
<bindings>
<customBinding>
<binding name="customBinding" closeTimeout="00:15:00" openTimeout="00:15:00" receiveTimeout="00:15:00" sendTimeout="00:15:00">
<gzipMessageEncoding innerMessageEncoding="textMessageEncoding"/>
<httpTransport hostNameComparisonMode="StrongWildcard" manualAddressing="False" maxReceivedMessageSize="2147483647"
authenticationScheme="Anonymous" bypassProxyOnLocal="False" realm="" useDefaultWebProxy="True" transferMode="Buffered"/>
</binding>
</customBinding>
</bindings>
<services>
<service behaviorConfiguration="KiProjectsSyncServiceBehavior" name="KiProjectsSyncService">
<endpoint address="" binding="customBinding" bindingConfiguration="KiProjectsSyncService" contract="IKiProjectsSyncService"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="KiProjectsSyncServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
<serviceThrottling maxConcurrentCalls="500" maxConcurrentSessions="500" maxConcurrentInstances="500"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
</system.serviceModel>
</configuration>
<services>
<service behaviorConfiguration="KiProjectsSyncServiceBehavior" name="KiProjectsSyncService">
<endpoint address="" binding="customBinding" bindingConfiguration="customBinding" contract="Kimetrica.Sync.IKiProjectsSyncService"/>
</service>
</services>
<system.serviceModel>
<extensions>
<bindingElementExtensions>
<add name="gzipMessageEncoding" type="Kimetrica.Sync.GZipEncoder.GZipMessageEncodingElement, GZipEncoder, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</bindingElementExtensions>
</extensions>
<bindings>
<customBinding>
<binding name="customBinding" closeTimeout="00:15:00" openTimeout="00:15:00"
receiveTimeout="00:15:00" sendTimeout="00:15:00">
<gzipMessageEncoding innerMessageEncoding="textMessageEncoding" />
<httpTransport manualAddressing="false" authenticationScheme="Anonymous"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
proxyAuthenticationScheme="Anonymous" realm="" useDefaultWebProxy="true" maxReceivedMessageSize="2147483647" transferMode="Buffered" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="http://localhost:1062/WcfTestWebSite/KiProjectsSyncService.svc"
binding="customBinding" bindingConfiguration="customBinding"
contract="KiProjectsSyncServiceReference.IKiProjectsSyncService" name="KiProjectsSyncService" />
<metadata>
<policyImporters>
<extension type="Microsoft.Samples.GZipEncoder.GZipMessageEncodingBindingElementImporter, GZipEncoder, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</policyImporters>
</metadata>
</client>
</system.serviceModel>