1

我编写了一个MessageSizeInspector类来检查服务从客户端接收到的消息的大小。这是它的样子:

//the actual implementation logs more!
//but in this question, my only concerns is request.ToString()
public sealed class MessageSizeInspector : 
            BehaviorExtensionElement,   //to enable it to be used in config
            IDispatchMessageInspector,  //service-side inspector
            IEndpointBehavior           //so we can apply it on endpoint
{
   if (request != null )
   {
      Logger.Verbose("Message = {0}\n", request.ToString()));
   }       
   //more  
}

它记录这种格式的消息:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://localhost:8961/EngineService</To>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/IEngineService/GetMousePatternID</Action>
  </s:Header>
  <s:Body>
    <GetMousePatternID xmlns="http://tempuri.org/">
      <args>
        <accelerator xmlns="http://schemas.datacontract.org/2004/07/Runaware.Insight.EngineService" />
        <accessKey xmlns="http://schemas.datacontract.org/2004/07/Runaware.Insight.EngineService" />
        <controlId xmlns="http://schemas.datacontract.org/2004/07/Runaware.Insight.EngineService">66222</controlId>

        <!--- deleted the rest to avoid verbosity -->

      </args>
    </GetMousePatternID>
  </s:Body>
</s:Envelope>

如您所见,实际消息很小,但 XML 元素和名称空间使它变得太大。特别是命名空间与实际消息相比太大了。

我的问题是:我们怎样才能减少肥皂信息的大小?由于xmlns所有元素都相同,WCF 可以对此进行优化,但事实并非如此。我们可以让它使用我们选择的更短的命名空间吗?很少有诸如acceleratorand之类的元素accessKey甚至没有任何价值(您可以通过向右滚动看到),但它们仍然存在!我们可以让 WCF 忽略它们并null在服务端假设它们的值(或默认值)吗?

简而言之,我们可以做些什么来节省带宽?

我假设上面的消息来自客户端,格式完全相同,具有相同的 XML 元素和命名空间。

服务器是用 C# 和 WCF 编写的,客户端是使用Windows Web 服务 API用 C++ 编写的。服务和客户端都是我写的。所以我可以完全控制它们。如果需要,我可以更改它以节省带宽!

4

4 回答 4

2

除了其他人已经说过的答案(例如:WCF 压缩)......

尝试在 DataContracts、DataMembers 以及 ServiceContracts 上设置名称和命名空间。

例子:

 [DataContract(Name = "a", Namespace = "")]
 class Person
 {
     [DataMember(Name = "a")]
     public string FullName;
     [DataMember(Name = "b)]
     public int Age;
 }

这将使 Person 在命名空间“”中被称为“a”,而属性 FullName 被称为“a”,从而使 XML 更短,例如:

<a> -- Represents the Person class
    <a>Name of the person</a> -- Represents the FullName property
    <b>38</b>
</a>

属性和类必须具有与 DataContract 和 DataMembers 不同的“短”名称。

参考:https ://bkiener.wordpress.com/2010/05/04/optimize-data-contracts-for-better-wcf-performance/

于 2017-09-12T02:22:05.750 回答
1

嗯,我的第一种方法是使用WCF Compression。我只能给你链接,因为我没有这方面的经验。但我认为,这将是一个很好的改进。

问题是,你对客户有影响吗?因为它的配置也必须被编辑。

编辑:您的评论之一回答了问题。:o)

于 2013-01-23T09:01:07.033 回答
1

欢迎使用 SOAP 和许多人遇到的无知问题。XML 很好,SOAP 也很好,但是有一个基于文本的表达系统的开销。带宽冲击很大,尤其是对于小消息。

您可以做的不多 - 在 IIS 中进行外部压缩,然后删除 soap / xml 并使用 JSON 访问 web api。web servviec/soap 标准是相当 - 嗯 - 明确和标准。绕过它(放弃要求,使用其他东西)是真正处理它的唯一方法。

于 2013-01-23T09:01:26.630 回答
0

既然您可以完全控制一切,为什么不改用WebAPI呢?

在做出最终决定之前先看看这个问题:Do I need WCF if I can use ASP.net Web API

于 2013-01-23T08:59:54.647 回答