CRN_Patch_3147881.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /**
  2. Licensed Materials - Property of IBM
  3. IBM Cognos Products: DOCS
  4. (C) Copyright IBM Corp. 2005
  5. US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with
  6. IBM Corp.
  7. */
  8. using System;
  9. using System.Web.Services;
  10. using System.Web.Services.Protocols;
  11. using System.IO;
  12. using System.Net;
  13. // Define a SOAP Extension that traces the SOAP request and SOAP
  14. // response for the XML Web service method the SOAP extension is
  15. // applied to.
  16. public class SOAP_Extension_3147881 : SoapExtension
  17. {
  18. Stream oldStream;
  19. Stream newStream;
  20. // Save the Stream representing the SOAP request or SOAP response into
  21. // a local memory buffer.
  22. public override Stream ChainStream( Stream stream )
  23. {
  24. oldStream = stream;
  25. newStream = new MemoryStream();
  26. return newStream;
  27. }
  28. public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
  29. {
  30. return "";
  31. }
  32. public override object GetInitializer(Type WebServiceType)
  33. {
  34. return "";
  35. }
  36. public override void Initialize(object initializer)
  37. {
  38. }
  39. public override void ProcessMessage(SoapMessage message)
  40. {
  41. switch (message.Stage)
  42. {
  43. case SoapMessageStage.BeforeSerialize:
  44. break;
  45. case SoapMessageStage.AfterSerialize:
  46. newStream.Position=0;
  47. Copy(newStream, oldStream);
  48. break;
  49. case SoapMessageStage.BeforeDeserialize:
  50. adjustBiBusHeader(message);
  51. break;
  52. case SoapMessageStage.AfterDeserialize:
  53. break;
  54. default:
  55. throw new Exception("invalid stage");
  56. }
  57. }
  58. public void adjustBiBusHeader(SoapMessage message)
  59. {
  60. newStream.Position=0;
  61. Stream tempStream = getNewStream();
  62. newStream.Position=0;
  63. Copy(tempStream,newStream);
  64. newStream.Position=0;
  65. }
  66. private Stream getNewStream()
  67. {
  68. Copy(oldStream,newStream);
  69. newStream.Position=0;
  70. System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
  71. byte[] tempBytes = new byte[(int)newStream.Length];
  72. newStream.Read(tempBytes,0,(int)newStream.Length);
  73. String inboundSOAP = enc.GetString(tempBytes);
  74. //enhance the open and closing tags for dispatcherTransportVars
  75. inboundSOAP = inboundSOAP.Replace("<bus:dispatcherTransportVars","<dispatcherTransportVars");
  76. inboundSOAP = inboundSOAP.Replace("</bus:dispatcherTransportVars","</dispatcherTransportVars");
  77. //enhance the open and closing tags for conversationContext
  78. inboundSOAP = inboundSOAP.Replace("<bus:conversationContext","<conversationContext");
  79. inboundSOAP = inboundSOAP.Replace("</bus:conversationContext","</conversationContext");
  80. //enhance the missing xsi:type for the conversationContext elements
  81. inboundSOAP = inboundSOAP.Replace("<id>","<id xsi:type=\"xsd:string\">");
  82. inboundSOAP = inboundSOAP.Replace("<affinityStrength>","<affinityStrength xsi:type=\"xsd:int\">");
  83. inboundSOAP = inboundSOAP.Replace("<status>","<status xsi:type=\"xsd:string\">");
  84. inboundSOAP = inboundSOAP.Replace("<bus:cookieVars","<cookieVars");
  85. inboundSOAP = inboundSOAP.Replace("</bus:cookieVars","</cookieVars");
  86. inboundSOAP = inboundSOAP.Replace("<bus:environmentVars","<environmentVars");
  87. inboundSOAP = inboundSOAP.Replace("</bus:environmentVars","</environmentVars");
  88. String finalXML = inboundSOAP;
  89. enc = new System.Text.UTF8Encoding();
  90. byte[] bytes = enc.GetBytes(finalXML);
  91. MemoryStream myNewStream = new MemoryStream(bytes,0,bytes.Length,true);
  92. myNewStream.Position=0;
  93. return myNewStream;
  94. }
  95. void Copy(Stream from, Stream to)
  96. {
  97. TextReader reader = new StreamReader(from);
  98. TextWriter writer = new StreamWriter(to);
  99. writer.WriteLine(reader.ReadToEnd());
  100. writer.Flush();
  101. }
  102. }
  103. [AttributeUsage(AttributeTargets.Method)]
  104. public class Cognos_ReportNet_Inbound_SOAP_Patch_3147881 : SoapExtensionAttribute
  105. {
  106. private int priority;
  107. public override Type ExtensionType
  108. {
  109. get { return typeof(SOAP_Extension_3147881); }
  110. }
  111. public override int Priority
  112. {
  113. get { return priority; }
  114. set { priority = value; }
  115. }
  116. }