2009-06-19 24 views
7

Tüm SOAP isteklerini ve yanıtlarını günlüğe kaydetmeyi amaçlayan bir SoapExtension'ım var. MS Soap Toolkit (OnBase İş Akışı) kullanan bir uygulamadan yapılan aramalar için iyi çalışır. Ama bir html sayfasında $ .ajax() tarafından yapılan aramalar için işe yaramıyor.ScriptService WebService istekleri nasıl izlenir?

[WebService(Namespace = XmlSerializationService.DefaultNamespace)] 
[ScriptService] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class DepartmentAssigneeService : WebService 
{ 
    private readonly DepartmentAssigneeController _controller = new DepartmentAssigneeController(); 

    /// <summary> 
    /// Fetches the role items. 
    /// </summary> 
    /// <returns></returns> 
    [WebMethod] 
    [SoapLog] 
    public ListItem[] FetchDepartmentItems() 
    { 
     return CreateListItems(_controller.FetchDepartments()); 
    } 
} 

Ve burada SoapExtension ve SoapExtensionAttribute için temel bilgiler şunlardır::

$.ajax({ 
    type: "POST", 
    url: url, 
    data: data, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json" 
}); 

Bu WebService ve ScriptService ile işaretlenmiş bir ASP.NET 3.5 WebService aradığını nitelikleri:

public class LoggingSoapExtension : SoapExtension, IDisposable { /*...*/ } 

[AttributeUsage(AttributeTargets.Method)] 
public sealed class SoapLogAttribute : SoapExtensionAttribute { /*...*/ } 
İşte bir örnek

LoggingSoapExtension'ın $ .ajax() istekleri üzerinde yürütülmesine izin verecek bir şey eksik miyim?

Güncelleme

@Chris Brandsma

Eğer Json talebinde web hizmeti (dataType: "json") üzerinden XML yerine sonuçlanır çünkü olabilir. Bu nedenle ScriptService özniteliği etkinleştiriliyor, ancak SOAP iletileri göndermiyorsunuz. SoapExtension neden çalışmadığını cevapları

. ScriptService ile izleme için herhangi bir öneriniz var mı? Akla gelen tek şey, bir isteği günlüğe kaydetmek için bir yöntem sağlayan bir ScriptService temel sınıfıdır. Ama sonra her ScriptService WebService'de her WebMethod'da bu yöntemi çağırmak zorundayım (birkaç tane var). Mümkünse bir şeyi SoapExtension özelliği olarak temiz ve basit bir şekilde kullanmak isterim.

cevap

2

Bir çözüm buldum. Bir IHttpModule kullanarak herhangi bir şeyden (SOAP, JSON, formlar, vb.) Istekleri kaydedebilirim. Aşağıdaki uygulamada, tüm .asmx ve .ashx isteklerini günlüğe kaydetmeyi seçtim. Bu LoggingSoapExtension sorunundan değiştirir.

public class ServiceLogModule : IHttpModule 
{ 
    private HttpApplication _application; 
    private bool _isWebService; 
    private int _requestId; 
    private string _actionUrl; 

    #region IHttpModule Members 

    public void Dispose() 
    { 
    } 

    public void Init(HttpApplication context) 
    { 
     _application = context; 
     _application.BeginRequest += ContextBeginRequest; 
     _application.PreRequestHandlerExecute += ContextPreRequestHandlerExecute; 
     _application.PreSendRequestContent += ContextPreSendRequestContent; 
    } 

    #endregion 

    private void ContextPreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     _application.Response.Filter = new CapturedStream(_application.Response.Filter, 
                  _application.Response.ContentEncoding); 
    } 

    private void ContextBeginRequest(object sender, EventArgs e) 
    { 
     string ext = VirtualPathUtility.GetExtension(_application.Request.FilePath).ToLower(); 
     _isWebService = ext == ".asmx" || ext == ".ashx"; 

     if (_isWebService) 
     { 
      ITraceLog traceLog = TraceLogFactory.Create(); 
      _actionUrl = _application.Request.Url.PathAndQuery; 

      StreamReader reader = new StreamReader(_application.Request.InputStream); 
      string message = reader.ReadToEnd(); 
      _application.Request.InputStream.Position = 0; 

      _requestId = traceLog.LogRequest(_actionUrl, message); 
     } 
    } 

    private void ContextPreSendRequestContent(object sender, EventArgs e) 
    { 
     if (_isWebService) 
     { 
      CapturedStream stream = _application.Response.Filter as CapturedStream; 
      if (stream != null) 
      { 
       ITraceLog traceLog = TraceLogFactory.Create(); 
       traceLog.LogResponse(_actionUrl, stream.StreamContent, _requestId); 
      } 
     } 
    } 
} 

Capturing HTML generated from ASP.NET'dan ağır bir şekilde ödünç aldım.

+0

CapturedStream nedir? – Naor

+0

http://stackoverflow.com/questions/386487/capturing-html-generated-from-asp-net/386648#386648 adresindeki ResponseCaptureStream ile aynıdır – jrummell

1

Eğer Json talebinde web hizmeti (dataType: "json") üzerinden XML yerine sonuçlanır çünkü olabilir. Bu nedenle ScriptService özniteliği etkinleştiriliyor, ancak SOAP iletileri göndermiyorsunuz.

Sen xml dataType değiştirip eğer inşaat görebiliyordu.

http://docs.jquery.com/Ajax/jQuery.ajax#options

Ayrıca günlük tutma başka bir seçenek Log4Net olacaktır. Senin için daha çok yönlü olabilir.

+0

Ben json talep ediyorum çünkü XML ayrıştırmak istemiyorum. ScriptService SOAP kullanmazsa, bu mantıklıdır. Teşekkürler! – jrummell

0

Kemancı (IE için öncelikle ama şimdi firefox için) ya da Kundakçı (firefox için) istemci tarafı isteklerini ve yanıtları izlemek için çok değerli araçlardır.

+0

Bu test için faydalı olabilir, ancak tam bir istek günlüğüne ihtiyacım var. – jrummell

İlgili konular