我不确定在Web服务中抛出异常是否是个好主意。如果没有堆栈跟踪,也许我并不会介意这一点。
我研究了几种实现方法,但似乎并没有共识。比如,CampaignMonitor返回一个Result对象,而其他人则不是这样。
从架构上看,我不确定返回一个Return对象是否有意义,毕竟异常就是异常,但我喜欢Return对象更为优雅的解决方案,这对最终用户来说更友好。
是否有更好的解决方案?
编辑
顺便说一下,我正在使用ASMX Web服务,无法打开CustomErrors选项。
我不确定在Web服务中抛出异常是否是个好主意。如果没有堆栈跟踪,也许我并不会介意这一点。
我研究了几种实现方法,但似乎并没有共识。比如,CampaignMonitor返回一个Result对象,而其他人则不是这样。
从架构上看,我不确定返回一个Return对象是否有意义,毕竟异常就是异常,但我喜欢Return对象更为优雅的解决方案,这对最终用户来说更友好。
是否有更好的解决方案?
编辑
顺便说一下,我正在使用ASMX Web服务,无法打开CustomErrors选项。
不要因为你在一个Web服务中而混淆了问题。那只是一些实现细节。
使用你的正常异常处理策略。最佳实践是不要在低级别代码中捕获异常,除非你可以在那里解决该异常并正常继续。异常应该被抛到表示层,以便用户可以被告知错误。
因此,对于Web服务,通常会抛出异常(结果是SoapFault)。这允许调用客户端代码使用其内置的异常处理标准来处理它。
SoapException
的形式呈现,其中 Message
属性包含连接文本的堆栈跟踪)。这太可怕了,我不知道如何关闭它。 - GSerg一种方法是将系统错误和业务错误分开。(系统错误:例如格式不正确的请求、用户未经授权等;业务错误:例如方法UpdateCars导致错误,用户没有任何汽车)。
在发生业务错误时,返回一个包含错误描述的响应对象;在发生系统错误时,抛出异常。
如果 Web 服务将公开使用,网络安全红队会喜欢提供详细的错误消息,以便对基础设施进行询问。然后我们可以针对该服务器使用特定的漏洞利用。(这并不是好事)。您的代码将在问题注册表中出现。建议在公共 Web 服务中使用任何默认的.NET异常消息的人只是在建议主题的变化或禁用诊断能力。建议使用不透露攻击服务器方法的自定义异常文本。
您能再解释一下吗?Web服务的服务器端可能会抛出异常。Web服务的服务器端可以向客户端返回消息。该消息可能包含错误信息,而该错误信息可能特别包括异常详细信息。或者也可能不包括。在客户端,通常有一个生成的代理来处理来自服务器的消息。如果响应包含错误信息,则此代理可能会生成异常。
您想了解这个场景的哪个部分呢?
我认为抛出异常通常比返回结果更好的设计模式。
我认为在您的 Web 服务中所要做的是,通过将以下模式应用于每个公开为 Web 服务的方法来隐藏堆栈跟踪:
public void MyWebServiceMethod() {
try
{///Do something that may cause an error
} catch(Exception ex)
{ throw new ApplicationException("User friendly descritption of exception");}
}
或者你也可以
catch(Exception ex) { throw ex; }
如果重新抛出异常,将会隐藏原始堆栈跟踪信息,这可能会影响你的 Web 服务客户端。
我不明白为什么你不能两者兼顾?捕获异常,将其记录下来(可以记录到数据库或文件中),然后返回错误代码。这样,您就可以优雅地执行WebService调用,并通知错误,同时还有其他地方可以进一步调试。