C# 如何将gzip MessageEncoding bindingElementExtension添加到现有的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

我正试图将gzip压缩消息编码器从包中放入现有的WCF/WSDL应用程序(使用
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>