To Zip the messages in Silverlight 4 & WCF
ב-SL4 מיקרוסופט הוסיפה את יכולות ההרחבה ל-SL4. כמו למשל הממשקים : IServiceBehavior , IContractBehavior & IOperationBehvior כלמור אנחנו מתחילים לקבל כמעט את כל מה שאנחנו מכירים מ-WCF דוט-נט.
בעקבות התוספות האלו כתבתי ZipMessageInspector, השתמשתי ב – ComponentOne Zip library. בשורה התחתונה קבלנו שיפור ענק בביצועים.
הקוד ב-SL:
Code Snippet
- public class ZipClientMessageInspector : IClientMessageInspector
- {
- public void AfterReceiveReply( ref Message reply , object correlationState )
- {
- //TODO: UnZip by Header.
- var reader = reply.GetBody<Byte[]>();
- using ( var ms = new MemoryStream( reader ) )
- using ( var zip = new C1ZStreamReader( ms ) )
- using ( var sr = new StreamReader( zip ) )
- {
- var result = sr.ReadToEnd();
- var xml = XElement.Parse( result );
- reply = Message.CreateMessage(
- reply.Version ,
- reply.Headers.Action ,
- xml
- );
- }
- }
- public object BeforeSendRequest( ref Message request , IClientChannel channel )
- {
- //TODO: Zip by Header.
- var reader = request.GetBody<XElement>()
- .ToString(SaveOptions.DisableFormatting);
- using ( var ms = new MemoryStream() )
- using ( var zip = new C1ZStreamWriter( ms ) )
- using ( var writer = new StreamWriter( zip ) )
- {
- writer.Write( reader );
- writer.Flush();
- var zipresult = ms.ToArray();
- request = Message.CreateMessage(
- request.Version ,
- request.Headers.Action ,
- zipresult
- );
- }
- return null;
- }
- }
הקוד ב-צד השרת:
Code Snippet
- public class ZipDispatchMessageInspector : IDispatchMessageInspector
- {
- public object AfterReceiveRequest( ref Message request , IClientChannel channel , InstanceContext instanceContext )
- {
- //TODO: UnZip by Header.
- var reader = request.GetBody<byte[]>();
- using( var ms = new MemoryStream( reader ) )
- using( var zip = new C1ZStreamReader( ms ) )
- using( var sr = new StreamReader( zip ) )
- {
- var result = sr.ReadToEnd();
- var xml = XElement.Parse(result);
- request = Message.CreateMessage(
- request.Version,
- request.Headers.Action,
- xml
- );
- }
- return null;
- }
- public void BeforeSendReply( ref Message reply , object correlationState )
- {
- //TODO: Zip by Header.
- var reader = reply.GetBody<XElement>().ToString(SaveOptions.DisableFormatting);
- using ( var ms = new MemoryStream() )
- using ( var zip = new C1ZStreamWriter( ms ) )
- using ( var sw = new StreamWriter( zip ) )
- {
- sw.Write( reader );
- sw.Flush();
- var zipresult = ms.ToArray();
- reply = Message.CreateMessage(
- reply.Version ,
- reply.Headers.Action ,
- zipresult
- );
- }
- }
- }
ניתן לשפר ולהוסיף עוד את ה-ZIP אך זה לפוסט הבא.