如何记录 Web 服务的 JSON 请求
本文关键字:服务 JSON 请求 Web 何记录 记录 | 更新日期: 2023-09-27 18:34:08
我有一个Web方法,它是从jquery的ajax方法调用的,如下所示:
$.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......
即使序列化失败,始终以某种方式获取和记录我的 Web 方法接收的原始 json 的最佳方法是什么?
在堆栈溢出的其他一些答案的帮助下,我得出了这个:
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>
您始终可以在服务器端执行此操作。
当您将请求发送到调用Web服务的"MyWebService.aspx/DoSomething"时,您可以将结果(成功/错误)记录到日志文件中。