SdlChannelSink.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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 (IChannelReceiver channel, IServerChannelSink next)
  21. {
  22. _next = next;
  23. _channel = channel;
  24. }
  25. public IServerChannelSink NextChannelSink
  26. {
  27. get { return _next; }
  28. }
  29. public IDictionary Properties
  30. {
  31. get { return null; }
  32. }
  33. public void AsyncProcessResponse (IServerResponseChannelSinkStack sinkStack,
  34. object state,
  35. IMessage msg,
  36. ITransportHeaders headers,
  37. Stream stream)
  38. {
  39. throw new NotSupportedException (); // Never called
  40. }
  41. public Stream GetResponseStream (IServerResponseChannelSinkStack sinkStack,
  42. object state,
  43. IMessage msg,
  44. ITransportHeaders headers)
  45. {
  46. return null;
  47. }
  48. public ServerProcessing ProcessMessage (IServerChannelSinkStack sinkStack,
  49. IMessage requestMsg,
  50. ITransportHeaders requestHeaders,
  51. Stream requestStream,
  52. out IMessage responseMsg,
  53. out ITransportHeaders responseHeaders,
  54. out Stream responseStream)
  55. {
  56. responseMsg = null;
  57. responseStream = null;
  58. responseHeaders = null;
  59. string verb = requestHeaders [CommonTransportKeys.RequestVerb] as string;
  60. string uri = (string) requestHeaders [CommonTransportKeys.RequestUri];
  61. if (verb == "GET" && uri.EndsWith ("?wsdl"))
  62. {
  63. try
  64. {
  65. uri = uri.Substring (0, uri.Length - 5);
  66. Type type = RemotingServices.GetServerTypeForUri (uri);
  67. string url = _channel.GetUrlsForUri (uri)[0];
  68. ServiceType st = new ServiceType (type, url);
  69. responseStream = new MemoryStream ();
  70. MetaData.ConvertTypesToSchemaToStream (new ServiceType[] {st}, SdlType.Wsdl, responseStream);
  71. responseStream.Position = 0;
  72. responseMsg = null;
  73. responseHeaders = new TransportHeaders ();
  74. responseHeaders [CommonTransportKeys.ContentType] = "text/xml";
  75. }
  76. catch (Exception ex)
  77. {
  78. responseHeaders = new TransportHeaders ();
  79. responseHeaders [CommonTransportKeys.HttpStatusCode] = "500";
  80. responseStream = new MemoryStream (Encoding.UTF8.GetBytes (ex.ToString ()));
  81. }
  82. return ServerProcessing.Complete;
  83. }
  84. else
  85. return _next.ProcessMessage (sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);
  86. }
  87. }
  88. }