【问题标题】:Hiding the stacktrace for an exception returned by a asp.net WebMethod?隐藏asp.net WebMethod返回的异常的堆栈跟踪?
【发布时间】:2009-04-21 16:43:27
【问题描述】:

我在我的 aspx 页面中使用带有属性 [WebMethod] 的方法。我不使用任何 asp.net ajax,而是使用 jQuery 来调用这些方法并以 JSON 格式返回对象。这一切都很好。

接下来我在 webMethod 中添加了一个授权检查,如果当前用户无权访问我需要让调用 JavaScript 知道的功能。

所以我抛出了一个 AccessViolationException 异常,然后可以通过 JavaScript 中的 OnError 回调函数对其进行解析。这也有效,但例外包括完整的 StackTrace,我不想将其提供给调用客户端。

当 WebMethod 返回业务对象时,我可以使用哪些其他方式向客户端返回“拒绝访问”?

我正在使用 ASP.Net 3.5SP1 和 jQuery 1.32

【问题讨论】:

    标签: asp.net web-services asmx


    【解决方案1】:

    您还可以添加:

    customErrors mode="On"/
    

    在您的 web.config 中,这将删除堆栈跟踪并只留下异常消息

    【讨论】:

      【解决方案2】:

      为什么要通过网络传播错误?为什么不使用错误响应?

      只需将您的对象包装在一个响应对象中,该对象可以包含状态错误代码和向用户显示的错误消息。

      【讨论】:

      • 我认为我对 WebMethod 的返回值几乎没有控制权,我可以返回预期的业务对象或 null。我将如何在其中抛出“错误响应”?
      • 您可以将您的 BusinessObject 封装在一个 ResponseObject 中,它可以自己拥有一个状态。你不能吗?
      • 我也是这么想的,谢谢你的意见。
      • 如果您能解释一下“使用错误响应”的意思会有所帮助
      • @notfed 下一段解释了这一点
      【解决方案3】:

      按照 NunFur 的建议,我改变了方法,而不是抛出错误,而是返回一个“更丰富”的对象。

      至少有两个选项,第一个是将我的业务对象封装到具有一些状态属性的响应对象中。我试过这个,但它使 JSON 更复杂。 因此,我没有添加一个新对象,而是向我的业务对象添加了两个属性,例如 ServiceStatus 和 ServiceMessage。默认情况下,这些是 200 和 '',但如果出现任何问题(无法访问,正确的错误),可以由 WebMethod 代码设置。在这种情况下,它们的业务对象将为“空”(无数据)。然后,JavaScript 代码首先检查 ServiceStatus 并做出适当的反应。

      我将这两个字段添加到由 WebMethods 返回的所有对象中,甚至是一个简单的字符串。他们必须实现具有这两个属性的接口。

      现在我可以完全控制通过电线传输的内容,以防发生意外情况。

      感谢您的意见

      【讨论】:

        【解决方案4】:

        当事情真的出错时,我会保存例外情况。 (例如无法连接到数据库)

        要么不返回任何内容(null/nill/whatever),要么返回 false bool 值。

        很抱歉,我没有比这更好的答案了……我得继续寻找自己。

        【讨论】:

          【解决方案5】:

          您可以查看 SoapException:http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapexception(VS.71).aspx

          我只是不确定,当它从 JavaScript 调用时它是否会起作用。特别是如果它是通过获取请求调用的。

          BTW AccessViolationException 据我所知是在应用程序访问它无法访问的内存时抛出的。

          /阿斯格

          【讨论】:

          • 这里不涉及 Soap,纯 HTTP 和 JSON。但是你是对的,AccessViolationException 是异常的错误选择。
          猜你喜欢
          • 2017-06-29
          • 1970-01-01
          • 2011-01-05
          • 1970-01-01
          • 2017-08-06
          • 2010-09-13
          • 1970-01-01
          • 2018-07-19
          相关资源
          最近更新 更多