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 要素と名前空間のために非常に大きくなっています。特に名前空間は、実際のメッセージに比べて大きすぎます。
私の質問は、soapメッセージのサイズをどのように減らすことができるかということです。xmlns
すべての要素で同じであるため、WCF はこれを最適化できますが、そうではありません。選択した短い名前空間を使用するようにできますか? accelerator
andのような値のない要素はほとんどaccessKey
ありませんが (右にスクロールするとわかります)、まだ存在しています! null
WCF でそれらを省略し、サービス側でそれらの値 (または既定値) を想定することはできますか?
要するに、帯域幅を節約するためにできることはありますか?
上記のメッセージが、まったく同じ形式で、同じ XML 要素と名前空間を使用してクライアントに送信されると想定しています。
サーバーは C# と WCF で記述され、クライアントはWindows Web Services APIを使用して C++ で記述されています。サービスとクライアントの両方が私によって書かれました。だから私はそれらを完全にコントロールしています。必要に応じて、帯域幅を節約するために変更することがあります。