SdlChannelSink.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. //
  2. // System.Runtime.Remoting.MetadataServices.SdlChannelSink
  3. //
  4. // Authors:
  5. // Martin Willemoes Hansen ([email protected])
  6. //
  7. // (C) 2003 Martin Willemoes Hansen
  8. //
  9. using System.Runtime.Remoting.Channels;
  10. using System.Runtime.Remoting.Messaging;
  11. using System.IO;
  12. using System.Collections;
  13. using System.Text;
  14. namespace System.Runtime.Remoting.MetadataServices
  15. {
  16. public class SdlChannelSink : IServerChannelSink, IChannelSinkBase
  17. {
  18. IServerChannelSink _next;
  19. IChannelReceiver _channel;
  20. public SdlChannelSink()
  21. {
  22. }
  23. internal SdlChannelSink (IChannelReceiver channel, IServerChannelSink next)
  24. {
  25. _next = next;
  26. _channel = channel;
  27. }
  28. public IServerChannelSink NextChannelSink
  29. {
  30. get { return _next; }
  31. }
  32. public IDictionary Properties
  33. {
  34. get { return null; }
  35. }
  36. public void AsyncProcessResponse (IServerResponseChannelSinkStack sinkStack,
  37. object state,
  38. IMessage msg,
  39. ITransportHeaders headers,
  40. Stream stream)
  41. {
  42. throw new NotSupportedException (); // Never called
  43. }
  44. public Stream GetResponseStream (IServerResponseChannelSinkStack sinkStack,
  45. object state,
  46. IMessage msg,
  47. ITransportHeaders headers)
  48. {
  49. return null;
  50. }
  51. public ServerProcessing ProcessMessage (IServerChannelSinkStack sinkStack,
  52. IMessage requestMsg,
  53. ITransportHeaders requestHeaders,
  54. Stream requestStream,
  55. out IMessage responseMsg,
  56. out ITransportHeaders responseHeaders,
  57. out Stream responseStream)
  58. {
  59. responseMsg = null;
  60. responseStream = null;
  61. responseHeaders = null;
  62. string verb = requestHeaders [CommonTransportKeys.RequestVerb] as string;
  63. string uri = (string) requestHeaders [CommonTransportKeys.RequestUri];
  64. if (verb == "GET" && uri.EndsWith ("?wsdl"))
  65. {
  66. try
  67. {
  68. uri = uri.Substring (0, uri.Length - 5);
  69. Type type = RemotingServices.GetServerTypeForUri (uri);
  70. string url = _channel.GetUrlsForUri (uri)[0];
  71. ServiceType st = new ServiceType (type, url);
  72. responseStream = new MemoryStream ();
  73. MetaData.ConvertTypesToSchemaToStream (new ServiceType[] {st}, SdlType.Wsdl, responseStream);
  74. responseStream.Position = 0;
  75. responseMsg = null;
  76. responseHeaders = new TransportHeaders ();
  77. responseHeaders [CommonTransportKeys.ContentType] = "text/xml";
  78. }
  79. catch (Exception ex)
  80. {
  81. responseHeaders = new TransportHeaders ();
  82. responseHeaders [CommonTransportKeys.HttpStatusCode] = "500";
  83. responseStream = new MemoryStream (Encoding.UTF8.GetBytes (ex.ToString ()));
  84. }
  85. return ServerProcessing.Complete;
  86. }
  87. else
  88. return _next.ProcessMessage (sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);
  89. }
  90. }
  91. }