PageRenderTime 49ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/Code/Platform/Framework/ServiceModel/Extensions/CloudMessageInspector.cs

http://github.com/waseems/inbox2_desktop
C# | 98 lines | 60 code | 18 blank | 20 comment | 1 complexity | cba32e9b14581d03c5211a9309b97f8a MD5 | raw file
Possible License(s): BSD-3-Clause
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.ServiceModel;
  6. using System.ServiceModel.Channels;
  7. using System.ServiceModel.Dispatcher;
  8. using System.Text;
  9. using System.Xml;
  10. using System.Xml.XPath;
  11. namespace Inbox2.Platform.Framework.ServiceModel.Extensions
  12. {
  13. public class CloudMessageInspector : IDispatchMessageInspector
  14. {
  15. public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
  16. {
  17. return null;
  18. }
  19. public void BeforeSendReply(ref Message reply, object correlationState)
  20. {
  21. MessageBuffer messageBuffer = reply.CreateBufferedCopy(Int32.MaxValue);
  22. // Create string builders
  23. StringBuilder source = GetMessageBufferAsStringBuilder(messageBuffer);
  24. // In case of an error, do not modify the message
  25. if (source.ToString().StartsWith("<s:Fault"))
  26. {
  27. reply = messageBuffer.CreateMessage();
  28. return;
  29. }
  30. StringBuilder target = new StringBuilder();
  31. // Read source xml
  32. StringReader sr = new StringReader(source.ToString());
  33. XmlTextReader reader = new XmlTextReader(sr);
  34. // Write target xml
  35. StringWriter sw = new StringWriter(target);
  36. XmlManglingWriter writer = new XmlManglingWriter(sw);
  37. writer.WriteNode(reader, true);
  38. reader.Close();
  39. writer.Flush();
  40. writer.Close();
  41. // Set target message
  42. reply = GetStringBuilderAsNewMessage(reply, target);
  43. // Log message
  44. //MessageLogger.LogReply(ref reply, log);
  45. }
  46. /// <summary>
  47. /// Returns a StringBuilder containing the contents of the given message buffer.
  48. /// </summary>
  49. /// <param name="messageBuffer"></param>
  50. /// <returns></returns>
  51. protected StringBuilder GetMessageBufferAsStringBuilder(MessageBuffer messageBuffer)
  52. {
  53. XPathNavigator nav = messageBuffer.CreateNavigator();
  54. XmlDocument navDoc = new XmlDocument();
  55. navDoc.LoadXml(nav.OuterXml);
  56. StringBuilder sb = new StringBuilder();
  57. sb.Append(navDoc.ChildNodes[0].ChildNodes[1].InnerXml);
  58. return sb;
  59. }
  60. /// <summary>
  61. /// Creates a new Message from the given StringBuilder using the provided source message.
  62. /// </summary>
  63. /// <param name="source"></param>
  64. /// <param name="sb"></param>
  65. /// <returns></returns>
  66. protected Message GetStringBuilderAsNewMessage(Message source, StringBuilder sb)
  67. {
  68. XmlDocument doc = new XmlDocument();
  69. doc.LoadXml(sb.ToString());
  70. XmlNodeReader reader = new XmlNodeReader(doc.DocumentElement);
  71. Message newMessage = Message.CreateMessage(source.Version, null, reader);
  72. //Copy headers
  73. newMessage.Headers.CopyHeadersFrom(source);
  74. foreach (string propertyKey in source.Properties.Keys)
  75. newMessage.Properties.Add(propertyKey, source.Properties[propertyKey]);
  76. // Copy newMessage to request
  77. return newMessage;
  78. }
  79. }
  80. }