using System; using System.Web; using System.Web.Handlers; using System.Web.Hosting; using System.Net; using System.Web.Services.Protocols; using System.Messaging; using System.Text; using System.IO; namespace newtelligence.Services.Core { /// /// /// public class MessageQueueWebRequest : WebRequest { private MemoryStream _requestStream; private string _contentType; private string _connectionGroupName; private long _contentLength; private ICredentials _credentials; private WebHeaderCollection _headers; private Message _requestMessage; private int _timeout; private string _method; private Uri _requestUri; /// /// /// public class MessageQueueWebRequestFactory : IWebRequestCreate { /// /// /// /// /// public WebRequest Create(Uri uri) { return new MessageQueueWebRequest(uri); } } /// /// This static constructor registers the message queue transport provider /// in the app domain when the class is being loaded. /// public static void RegisterMSMQProtocol() { WebRequest.RegisterPrefix("msmq", new MessageQueueWebRequestFactory()); } /// /// The Message Queue URI takes the form of msmq://server/queueName /// /// public MessageQueueWebRequest(Uri uri) { _headers = new WebHeaderCollection(); _requestStream = new MemoryStreamNoClose(); _requestUri = uri; _requestMessage = new Message(); _requestMessage.Formatter = new XmlMessageFormatter(); _requestMessage.BodyStream = new MemoryStream(); } /// /// /// /// public override Stream GetRequestStream() { return _requestStream; } /// /// /// /// /// /// public override IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state) { return new WebRequestAsyncResult( GetRequestStream() ); } /// /// /// /// /// public override Stream EndGetRequestStream(IAsyncResult asyncResult) { return asyncResult.AsyncState as Stream; } /// /// /// /// /// /// public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state) { return new WebRequestAsyncResult( GetResponse() ); } /// /// /// /// /// public override WebResponse EndGetResponse(IAsyncResult asyncResult) { return asyncResult.AsyncState as WebResponse; } /// /// /// /// public override WebResponse GetResponse() { using ( MessageQueue queue = OpenQueue() ) { _requestMessage.BodyStream = new MemoryStream(_requestStream.ToArray()); _requestMessage.Label = _headers["SOAPAction"]; _requestMessage.Label = _requestMessage.Label.Trim('\"'); _requestMessage.UseAuthentication = queue.Authenticate; _requestMessage.UseEncryption = queue.EncryptionRequired == EncryptionRequired.Body;; if ( queue.Transactional ) { if ( System.EnterpriseServices.ContextUtil.IsInTransaction ) { queue.Send( _requestMessage, MessageQueueTransactionType.Automatic ); } else { queue.Send( _requestMessage, MessageQueueTransactionType.Single ); } } else { queue.Send( _requestMessage, MessageQueueTransactionType.None ); } _requestMessage.Dispose(); } return new MessageQueueWebResponse(); } /// /// /// public override string ContentType { get { return _contentType; } set { _contentType = value; } } /// /// /// public override void Abort() { base.Abort (); } /// /// /// public override string ConnectionGroupName { get { return _connectionGroupName; } set { _connectionGroupName = value; } } /// /// /// public override long ContentLength { get { return _contentLength; } set { _contentLength = value; } } /// /// /// public override ICredentials Credentials { get { return _credentials; } set { _credentials = value; } } /// /// /// public override WebHeaderCollection Headers { get { return _headers; } set { _headers = value; } } /// /// /// public override string Method { get { return _method; } set { _method = value; } } /// /// /// public override bool PreAuthenticate { get { return false; } set { // ignore that call } } /// /// /// public override IWebProxy Proxy { get { return null; } set { // ignore } } /// /// /// public override Uri RequestUri { get { return _requestUri; } } /// /// /// public override int Timeout { get { return _timeout; } set { _timeout = value; } } /// /// /// /// private MessageQueue OpenQueue() { string queueName = _requestUri.Host + _requestUri.AbsolutePath.Replace("/","\\"); MessageQueue queue = new MessageQueue(queueName); return queue; } } }