我编写了一个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 可以对此进行优化,但事实并非如此。我们可以让它使用我们选择的更短的命名空间吗?很少有诸如accelerator
and之类的元素accessKey
甚至没有任何价值(您可以通过向右滚动看到),但它们仍然存在!我们可以让 WCF 忽略它们并null
在服务端假设它们的值(或默认值)吗?
简而言之,我们可以做些什么来节省带宽?
我假设上面的消息来自客户端,格式完全相同,具有相同的 XML 元素和命名空间。
服务器是用 C# 和 WCF 编写的,客户端是使用Windows Web 服务 API用 C++ 编写的。服务和客户端都是我写的。所以我可以完全控制它们。如果需要,我可以更改它以节省带宽!