如何配置自托管 WCF 服务来压缩消息

How to configure self hosted WCF service to compress messages

我一直在网上查找,但找不到有关如何配置 basicHTTP 自承载 WCF 服务以压缩服务器发送给客户端的消息的定义过程或示例。

我想使用 GZIP 或类似技术。

这是我的应用程序app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>      
  <system.serviceModel>
    <services>
      <service name="Application.ApplicationServicesProxy" behaviorConfiguration="ApplicationSvcsBehave">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:9001/ApplicationSvcs"/>
          </baseAddresses>
        </host>
        <endpoint address="http://localhost:9001/ApplicationSvcs" binding="basicHttpBinding" contract="Application.IApplicationServices"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ApplicationSvcsBehave">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
  </startup>
</configuration>

这是我创建服务的方式:

var host = new ServiceHost(typeof(ApplicationServicesProxy));
host.Open();

服务是在 ApplicationServicesProxy 继承的 IApplicationServices 中定义的

[ServiceContract]
interface IApplicationServices
{
    [OperationContract]
    string[] MethodOne();
}

public class AppicationServicesProxy : IApplicationServices
{
    public string[] MethodOne()
    {
         // return a string value;
    }
}

这就是我将客户端连接到服务的方式

var ApplicationSvcs = new ApplicationSvcs.ApplicationServicesClient("BasicHttpBinding_IApplicationServices");

我目前使用的是 .NET 4.8

我这样做解决了,消息大小从 300 Kb/s 减少到 11 Kb/s 所以它确实有效并且 CPU 对此不是很感兴趣:

<system.serviceModel>
    <services>
      <service name="Application.ApplicationServicesProxy" behaviorConfiguration="ApplicationSvcsBehave">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:9001/ApplicationSvcs"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="customBinding" bindingConfiguration="BinaryCompressionBinding" contract="Application.IApplicationServices"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ApplicationSvcsBehave">
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <customBinding>
        <binding name="BinaryCompressionBinding">
          <binaryMessageEncoding compressionFormat ="GZip"/>
          <httpTransport decompressionEnabled="true"/>
        </binding>
      </customBinding>
    </bindings>
  </system.serviceModel>

在客户端

 <system.serviceModel>
    <bindings>
      <customBinding>
        <binding name="CustomBinding_IApplicationServices" >
          <binaryMessageEncoding compressionFormat="GZip"/>
          <httpTransport maxReceivedMessageSize="20000000"/>
        </binding>           
      </customBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:9001/ApplicationSvcs" binding="customBinding"
        bindingConfiguration="CustomBinding_IApplicationServices" contract="ApplicationSvcs.IApplicationServices"
        name="CustomBinding_IApplicationServices" />          
    </client>
  </system.serviceModel>

SOAP 消息可能非常繁重,但在我的应用程序中我无法使用 REST,所以我希望这能有所帮助。