2012-05-15 4 views
5

WebサービスのJSONリクエストログインする方法:私はこのように、jQueryのAJAXメソッドから呼び出されたWebメソッドを、持っている

$.ajax({ 
    type: "POST", 
    url: "MyWebService.aspx/DoSomething", 
    data: '{"myClass": ' + JSON.stringify(myClass) + '}', 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    async: false, 
    success: function (result) { 
     alert("success"); 
    }, 
    error: function() { 
     alert("error"); 
    } 
}); 

をそして、これは私のウェブメソッドです:

[WebMethod(EnableSession = true)] 
public static object DoSomething(MyClass myClass) 
{ 
    HttpContext.Current.Request.InputStream.Position = 0; 
    using (var reader = new StreamReader(HttpContext.Current.Request.InputStream)) 
    { 
    Logger.Log(reader.ReadToEnd()); 
    } 
} 

の場合javascript内のmyClassは正しい形式にシリアル化され、次にDoSomethingメソッドが実行され、生のjsonがデータベースに保存されます。 しかし、myClassが間違っていると、メソッドが全く実行されず、問題のあるjsonをログに記録できません...

生のjsonをいつも取得してログに記録する最良の方法は、メソッドは、シリアル化に失敗した場合でも受け取る?

+1

は、あなたが何かを見つける必要があり、「IISログ要求HttpModuleを」をグーグルで試してみてください有用な(申し訳ありません、私は今すぐ関連コードを見つけることができません) – Alex

+0

@alex - ありがとう、IHttpModuleは私が必要としていたものです。 – sventevit

答えて

1

私はこれに来た:

public class RequestLogModule : IHttpModule 
{ 
    private HttpApplication _application; 

    public void Dispose() 
    { 
    } 

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

    private void ContextBeginRequest(object sender, EventArgs e) 
    { 
     var request = _application.Request; 

     var bytes = new byte[request.InputStream.Length]; 
     request.InputStream.Read(bytes, 0, bytes.Length); 
     request.InputStream.Position = 0; 
     string content = Encoding.UTF8.GetString(bytes); 

     Logger.LogRequest(
      request.UrlReferrer == null ? "" : request.UrlReferrer.AbsoluteUri, 
      request.Url.AbsoluteUri, 
      request.UserAgent, 
      request.UserHostAddress, 
      request.UserHostName, 
      request.UserLanguages == null ? "" : request.UserLanguages.Aggregate((a, b) => a + "," + b), 
      request.ContentType, 
      request.HttpMethod, 
      content 
     ); 
    } 
} 

そしてweb.configファイル内:

<httpModules> 
    <add name="MyRequestLogModule" type="MyNamespace.RequestLogModule, MyAssembly"/> 
</httpModules> 
-3

いつでもサーバー側で実行できます。

Webサービスを呼び出すMyWebService.aspx/DoSomethingにリクエストを送信したときに、結果(成功/エラー)をログファイルに記録できます。 stackoverflowの上のいくつかの他の回答の助けを借りて

関連する問題