gpt4 book ai didi

c# - JSON WebMethods 的 SoapExtension 等效项是什么?

转载 作者:行者123 更新时间:2023-12-02 15:45:32 27 4
gpt4 key购买 nike

我有一些 Web 方法,用于调用一些外部服务(例如 Google Calendar API),显然这些方法可能非常脆弱。

不幸的是,我现在意识到,在这些方法上引发的任何错误都不会导致异常冒泡到 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 之类的工具检查代码,则无法将方法或类传递给页面 WebMethods(如 SoapExtension)。该错误在 ASP.Net 调用 Web 方法时被 ASP.Net 吞噬,您收到的唯一通知是发送到客户端的 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 还没有准备好用于生产代码,真丢脸。

关于c# - JSON WebMethods 的 SoapExtension 等效项是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9583054/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com