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;
}
}
}