B
Bruce Hodge
Hi,
We have a couple of clients who are having trouble connecting to .Net
webservices, (they're coming from PHP and VFP). We were looking to provide
a diagonostic tool that displayed the soap message submitted so that if the
call failed they could compare their SoapMessage with the ones we generate
in .Net.
Thought the solution was an HttpModule hooked into begin request, but after
approx 10 requests it hangs the webservice/aspnet service, any thoughts?
Code below.
(The HttpRequests are stored in Typed Dataset, stored on the Application
object so that they can be accessed from webpages.)
public void OnBeginRequest(Object s, EventArgs e)
{
try
{
// Cast the Object to the HttpApplication variable.
HttpApplication app = (HttpApplication)s;
HttpRequest newRequest = app.Request;
string servers = this.ServicesToMonitor();
int posn =
servers.ToLower().IndexOf(this.GetServiceName(newRequest).ToLower());
if (posn > -1)
this.AddFromHttpRequest(this.RequestHistory, newRequest);
}
catch (Exception ex)
{
//Custom error logging code
}
}
private void AddFromHttpRequest(Mars.Schema.HttpRequests history,
HttpRequest request)
{
try
{
HttpContext.Current.Application.Lock();
byte [] byteArray = new byte[request.ContentLength];
request.InputStream.Read(byteArray, 0, request.ContentLength);
// Must reset the Input Stream position or the whole process fails.
request.InputStream.Position = 0;
Mars.Schema.HttpRequests.RequestsRow row =
this.RequestHistory.Requests.AddRequestsRow(
request.RawUrl,
request.HttpMethod,
request.ContentType,
request.ContentLength,
Encoding.ASCII.GetString(byteArray, 0, request.ContentLength),
DateTime.Now,
this.GetServiceName(request),
this.SOAPAction(request),
request.ServerVariables["REMOTE_ADDR"]);
foreach (string s in request.Headers.AllKeys)
this.RequestHistory.HttpHeaders.AddHttpHeadersRow(row.RequestID,
s, request.Headers);
while (this.RequestHistory.Requests.Count > this.HistorySize)
{
this.RequestHistory.Requests[0].Delete();
}
this.RequestHistory.AcceptChanges();
HttpContext.Current.Application.UnLock();
}
catch (Exception ex)
{
#region Catch Block
#endregion
HttpContext.Current.Application.UnLock();
}
}
We have a couple of clients who are having trouble connecting to .Net
webservices, (they're coming from PHP and VFP). We were looking to provide
a diagonostic tool that displayed the soap message submitted so that if the
call failed they could compare their SoapMessage with the ones we generate
in .Net.
Thought the solution was an HttpModule hooked into begin request, but after
approx 10 requests it hangs the webservice/aspnet service, any thoughts?
Code below.
(The HttpRequests are stored in Typed Dataset, stored on the Application
object so that they can be accessed from webpages.)
public void OnBeginRequest(Object s, EventArgs e)
{
try
{
// Cast the Object to the HttpApplication variable.
HttpApplication app = (HttpApplication)s;
HttpRequest newRequest = app.Request;
string servers = this.ServicesToMonitor();
int posn =
servers.ToLower().IndexOf(this.GetServiceName(newRequest).ToLower());
if (posn > -1)
this.AddFromHttpRequest(this.RequestHistory, newRequest);
}
catch (Exception ex)
{
//Custom error logging code
}
}
private void AddFromHttpRequest(Mars.Schema.HttpRequests history,
HttpRequest request)
{
try
{
HttpContext.Current.Application.Lock();
byte [] byteArray = new byte[request.ContentLength];
request.InputStream.Read(byteArray, 0, request.ContentLength);
// Must reset the Input Stream position or the whole process fails.
request.InputStream.Position = 0;
Mars.Schema.HttpRequests.RequestsRow row =
this.RequestHistory.Requests.AddRequestsRow(
request.RawUrl,
request.HttpMethod,
request.ContentType,
request.ContentLength,
Encoding.ASCII.GetString(byteArray, 0, request.ContentLength),
DateTime.Now,
this.GetServiceName(request),
this.SOAPAction(request),
request.ServerVariables["REMOTE_ADDR"]);
foreach (string s in request.Headers.AllKeys)
this.RequestHistory.HttpHeaders.AddHttpHeadersRow(row.RequestID,
s, request.Headers
while (this.RequestHistory.Requests.Count > this.HistorySize)
{
this.RequestHistory.Requests[0].Delete();
}
this.RequestHistory.AcceptChanges();
HttpContext.Current.Application.UnLock();
}
catch (Exception ex)
{
#region Catch Block
#endregion
HttpContext.Current.Application.UnLock();
}
}