- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些 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/
我正在尝试编写 soap 扩展。但是框架没有加载它。 我已经添加到 web.config 即使我将类型更改为一些废话它也不会抛出异常。 最佳答案 我一直遇到类
背景:我正在尝试编写一个简单的 SoapExtension 类来记录来自 asmx Web 服务的入站/出站 Soap 消息。正在关注this article on msdn ,我已经能够使事情正常进
我有一个派生自 SoapExtension 的类。要进行单元测试,例如 ProcessMessage(SoapMessage) 方法,我需要输入一个 SoapMessage,它是一个抽象类。当我尝试这
我有一些 Web 方法,用于调用一些外部服务(例如 Google Calendar API),显然这些方法可能非常脆弱。 不幸的是,我现在意识到,在这些方法上引发的任何错误都不会导致异常冒泡到 Glo
我创建了一个 SoapExtension 类来捕获来自特定 Web 服务调用的 soap 请求和响应。为了使这个 SoapExtension 生效,我必须向生成的代理客户端中的方法添加一个属性。 例如
我需要使用一个SoapExtension 子类(我已经创建),但似乎只能通过一个web.config 文件来初始化这个类。我已经读到它应该可以通过 app.config 文件实现,但我不知道该怎么做。
我在配置 SoapExtension 时遇到问题(而不是在实现方面)。首先,我已经阅读了所有这些帖子(以及其他帖子),它们在某种程度上与 SoapExtensions 相关: Intercept SO
我是一名优秀的程序员,十分优秀!