与JSON WebMethods的SoapExtension相同的是什么?

我使用了一些网络方法来调用Google Calendar API等外部服务,显然这些方法非常脆弱。

不幸的是,我现在意识到在这些方法上抛出的任何错误都不会导致exception冒泡到Global.asax,这是在这个应用程序中记录错误的地方。

我已经看到了将方法包装在try / catch中的建议,这是一种愚蠢的方式,因为ASP.Net仍会默默地吞下各种错误。

在试图找到一个解决方案时,我已经看到了很多对SoapExtension的引用,这正是我想要做的,但是当我返回Json时不会被解雇。 我真正想要的是一种捕捉错误的方法。

任何指点赞赏,我仍然无法理解ASP.Net团队如何能够认为如此默默地吞噬错误是一个好主意。

所以例如这样的方法:

  [WebMethod] [ExceptionHandling] //can I write a handler like this to catch exceptions from JSON webservices? static public void DeleteItem(string id) { var api = new GoogleCalendarAPI(User.InternalUser()); api.DeleteEvent(id); return "success"; } 

对于JSON WebMethods,没有与SoapExtension等效的内容,并且在生产站点中打开自定义错误将导致返回到客户端的一般错误消息,服务器上不会出现任何错误。 你不能绕过这个。

如果使用ILSpy之类的东西检查代码,则无法传递方法或类来寻找像SoapExtension这样的WebMethods。 ASP.Net在调用Web方法时吞下该错误,您将获得的唯一通知是发送到客户端的HTTP 500错误,并带有总体通用错误消息。

在4.0中,WebMethods被调用:

 // System.Web.Script.Services.RestHandler internal static void ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData) { try { //snip irrelevant code RestHandler.InvokeMethod(context, methodData, rawParams); } catch (Exception ex) { RestHandler.WriteExceptionJsonString(context, ex); } } 

因此,如果调用你的方法会抛出一个错误,它将调用以下代码,statusCode为500,那里没有重新抛出,没有其他你可以传入的内容,所以除非我是盲目的,否则它会被静默吞噬。 更糟糕的是,如果你打开了自定义错误,任何理智的人都会这样做,它会完全模糊原因:

 // System.Web.Script.Services.RestHandler internal static void WriteExceptionJsonString(HttpContext context, Exception ex, int statusCode) { //snip code setting up response context.Response.TrySkipIisCustomErrors = true; using (StreamWriter streamWriter = new StreamWriter(context.Response.OutputStream, new UTF8Encoding(false))) { if (ex is TargetInvocationException) { ex = ex.InnerException; } if (context.IsCustomErrorEnabled) { streamWriter.Write(JavaScriptSerializer.SerializeInternal(RestHandler.BuildWebServiceError(AtlasWeb.WebService_Error, string.Empty, string.Empty))); } else { streamWriter.Write(JavaScriptSerializer.SerializeInternal(RestHandler.BuildWebServiceError(ex.Message, ex.StackTrace, ex.GetType().FullName))); } streamWriter.Flush(); } } 

我看不到它的方法,看起来WebMethod还没有为生产代码做好准备,很遗憾。

它并没有消失,更多的是它们被传递给了呼叫客户端。 但是,由于您并不总是希望(或应该)透露您的服务的这些私密细节,因此您可以防止错误冒出您的服务。 这给人以他们消失的印象。

在try-catch中包含内部细节是处理任何错误的最佳方法。 在该方法中,您正在处理标准错误捕获。 所以我想你想要的东西:

 [WebMethod] static public string DeleteItem(string id) { try { var api = new GoogleCalendarAPI(User.InternalUser()); api.DeleteEvent(id); return "success"; } catch(Exception ex) { log.fatal(ex); return "error"; } } 

如果有任何东西在try-catch中引发exception,它将被捕获。 ASP.Net不会干扰它,除非您调用的方法已经过专门编码。

编辑

如果GoogleCalendarAPI类反过来调用一个方法,例如ExecuteWebServiceCall捕获exception,那么你必须解析响应。 我希望他们给你一些其他线索,比如响应代码,以指示错误状态。 然后你可以将它包装在一个Exception中,抛出它让你的默认error handling程序捕获它。