我们有一个较旧的ASP.NET WebForms应用程序,该应用程序通过$.ajax()
在客户端使用jQuery
调用来执行AJAX请求,并在用[WebMethod]
属性修饰的代码背后的页面中调用静态方法。
如果WebMethod中发生未处理的异常,它将不会触发该Application_Error
事件,因此不会被我们的错误记录器(ELMAH)接收。这是众所周知的,不是问题-
我们将所有WebMethod代码包装在try-catch块中,但例外情况已手动记录到ELMAH中。
但是,有一种情况令我难过。如果格式错误的Json发布到WebMethod URL,则在输入我们的代码之前它将引发异常,并且我找不到任何方法来捕获此错误。
例如此WebMethod签名
[WebMethod]
public static string LeWebMethod(string stringParam, int intParam)
通常使用Json有效负载调用,例如:
{"stringParam":"oh hai","intParam":37}
我尝试使用Fiddler进行测试以将有效载荷编辑为格式错误的Json:
{"stringParam":"oh hai","intPara
并将以下ArgumentException
错误响应从JavaScriptObjectDeserializer
发送到客户端(这是在本地运行的没有自定义错误的简单测试应用中):
{"Message":"Unterminated string passed in. (32): {\"stringParam\":\"oh hai\",\"intPara","StackTrace":" at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeString()\r\n at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeMemberName()\r\n at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)\r\n at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)\r\n at
System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)\r\n at
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n at
System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n at
System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n at
System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n at
System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System.ArgumentException"}
它仍然不会触发该Application_Error
事件,并且它永远不会输入我们的代码,因此我们无法自己记录该错误。
我发现了一个类似的问题,该问题指向博客文章“
如何为Web服务创建全局异常处理程序
”,但是该问题似乎仅对SOAP
Web服务有效,而对AJAX
GET / POST无效。
在我的情况下,是否有一些类似的方法来附加自定义处理程序?
根据参考资料,内部RestHandler.ExecuteWebServiceCall
方法捕获所有抛出的异常,GetRawParams
并将它们简单地写入响应流,这就是为什么Application_Error
不对其进行调用的原因:
internal static void ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData) {
try {
...
IDictionary<string, object> rawParams = GetRawParams(methodData, context);
InvokeMethod(context, methodData, rawParams);
}
catch (Exception ex) {
WriteExceptionJsonString(context, ex);
}
}
我能想到的唯一解决方法是创建一个输出过滤器来拦截并记录输出:
public class PageMethodExceptionLogger : Stream
{
private readonly HttpResponse _response;
private readonly Stream _baseStream;
private readonly MemoryStream _capturedStream = new MemoryStream();
public PageMethodExceptionLogger(HttpResponse response)
{
_response = response;
_baseStream = response.Filter;
}
public override void Close()
{
if (_response.StatusCode == 500 && _response.Headers["jsonerror"] == "true")
{
_capturedStream.Position = 0;
string responseJson = new StreamReader(_capturedStream).ReadToEnd();
// TODO: Do the actual logging.
}
_baseStream.Close();
base.Close();
}
public override void Flush()
{
_baseStream.Flush();
}
public override long Seek(long offset, SeekOrigin origin)
{
return _baseStream.Seek(offset, origin);
}
public override void SetLength(long value)
{
_baseStream.SetLength(value);
}
public override int Read(byte[] buffer, int offset, int count)
{
return _baseStream.Read(buffer, offset, count);
}
public override void Write(byte[] buffer, int offset, int count)
{
_baseStream.Write(buffer, offset, count);
_capturedStream.Write(buffer, offset, count);
}
public override bool CanRead { get { return _baseStream.CanRead; } }
public override bool CanSeek { get { return _baseStream.CanSeek; } }
public override bool CanWrite { get { return _baseStream.CanWrite; } }
public override long Length { get { return _baseStream.Length; } }
public override long Position
{
get { return _baseStream.Position; }
set { _baseStream.Position = value; }
}
}
在Global.asax.cs(或HTTP模块)中,将过滤器安装在Application_PostMapRequestHandler
:
protected void Application_PostMapRequestHandler(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
if (context.Handler is Page && !string.IsNullOrEmpty(context.Request.PathInfo))
{
string contentType = context.Request.ContentType.Split(';')[0];
if (contentType.Equals("application/json", StringComparison.OrdinalIgnoreCase))
{
context.Response.Filter = new PageMethodExceptionLogger(context.Response);
}
}
}
我无法用axios捕捉错误响应。怎么做?我用的是: 我看到ajax请求的结果有400个状态代码,响应主体看起来像(Django后端)。没关系,我已经准备好在catch处理程序中处理这些错误了。 但是它们转到成功处理程序。为何如此?我在控制台中看到以下输出: 成功处理程序接收axios错误对象作为结果。为什么会这样,下一步该怎么办?此错误对象不包含任何有用信息。 UPD。实际上,错误对象包含有用的信
我正在尝试使用改装将图像上载到本地服务器。下面是我的php代码。 但是我得到了这样一个错误:com.google.gson.stream.MalformedJsonException使用JsonReader.setLenient(true)在第1行第1列路径$处接受格式错误的JSON。 然后,我在初始化改装的类中添加了以下代码。 现在我得到以下错误:com.google.gson.JsonSynt
我试图从JsonData将AdMob ID输入我的应用程序,以便将来可以更改它。 我的愿景: JSON文件将被上传到我的服务器,它的链接将在应用程序内。在json文件中找到的AdMob ID应在应用adUnitID中使用。到目前为止,我做了这个: 这是我的json文件: 问题是,它不仅不起作用,还会导致我的应用程序崩溃,并出现以下错误: 编辑:新日志: 我的片段完整代码: 任何帮助将不胜感激,谢谢
问题内容: 我想使用Javascript 解析此内容。数据如下所示: 在线上的每个教程都教您如何使用Twitter解析JSON,但是我不太确定如何使用JSON解析。 我想在一个网站上进行设置,以查看NFL团队在一个有趣的项目中获得的分数,以及有关解析JSON的良好学习体验,因为我不太在乎Twitter的东西。 这可能吗?有什么好的入门教程吗?甚至一些起始代码? 问题答案: 一般来说,您可以使用 J
我有问题返回jpg格式。当我的文件是jpg格式时,最终的格式是jpeg。我的方法: 我想收到照片的实际格式,有没有人遇到过这样的情况,知道如何解决?
我用这些类创建了一个登录名,但给了我一个错误 (!)致命错误:未捕获的错误:调用未定义的方法UserController::c在第17行的C:\xampp\htdocs\progetto个性\控制器\User Controller.php ( ! ) 错误:调用C:\xampp\htdocs\progetOpersonale\controllers\User Controller中未定义的方法Us