我不确定我是否完全满意在Web服务中抛出异常是个好主意。如果不是因为堆栈跟踪,我不会这么介意。这不是我不想做的事情。
我已经研究了几个实现,似乎对此没有达成共识。例如,CampaignMonitor确实返回了一个Result对象,但其他的却没有。
从体系结构上讲,我不确定返回一个返回对象是否有意义,异常肯定是异常,但我喜欢Return对象的原因是它对最终用户来说是一个更优雅的解决方案。
有人有更好的解决办法吗?
编辑
顺便说一句,我正在使用ASMX Web服务,在那里打开CustomErrors不是一个选项。
7条答案
按热度按时间ymzxtsji1#
不要让你在一个web服务中的事实混淆了这个问题,这只是一个实现细节。
使用您的正常异常处理策略。最佳实践是不要在低级代码中捕获异常--除非您可以在那里解决该异常并正常继续。异常应该被引发到表示层,以便用户可以被通知错误。
因此,当应用于Web服务时--通常抛出异常(这会导致SoapFault)。这允许调用客户端代码使用其内置的异常处理标准来处理它。
jaxagkaj2#
你在说什么堆栈跟踪?你试过这个吗?
在ASMX和WCF服务中,未捕获的异常将被转换为SOAP错误。在这两种情况下,可以将它们配置为不包括任何堆栈跟踪。实际上,这是WCF中的默认设置。
因此,返回此类错误的正确方法是通过fault。生成fault的一种方法是抛出而不处理异常。
w3nuxt5m3#
一种方法是分离系统错误和业务错误。2(系统错误:例如格式错误的请求、用户未授权等;业务错误:例如,方法UpdateCars导致错误,用户不拥有任何汽车)。
业务错误时,返回包含错误描述的响应对象;如果出现系统错误,则抛出异常。
2wnc66cl4#
您能澄清一下吗?Web服务的服务器端可以抛出异常。Web服务的服务器端可以向客户端返回一条消息。该消息可能包含错误信息,并且该错误信息可能特别包括异常详细信息。也可能不包括。在客户端,你通常有一个生成的代理来处理来自服务器的消息。2如果响应包含错误信息,这个代理可能会生成一个异常。
你对这个场景的哪一部分感到疑惑?
1qczuiv05#
我认为抛出异常通常是比返回结果更好的设计模式。我认为您必须在Web服务中隐藏堆栈跟踪,方法是将以下模式应用于每个作为Web服务公开的方法:
我的网页服务方法(){
尝试
{
} catch(异常示例)
{ throw new ApplicationException(“异常的用户友好描述”);
}
}
或者您也可以
catch(异常ex){ throw ex;}
如果重新引发异常,则将对Web Service的客户端隐藏原始堆栈跟踪。
chhkpiq46#
我不明白为什么你不能同时做这两件事?捕获异常,记录它(或者到数据库或者到文件),然后返回一个错误代码。这样你就可以很好地执行Web服务调用,也可以得到错误通知,并且你还有一个地方可以进一步调试。
qltillow7#
如果Web服务将被公开使用,网络安全红队会喜欢冗长的错误消息,允许询问基础设施。然后我们可以用特定的漏洞攻击该服务器。(这不是一件好事)。你的代码会弹出在问题登记簿上。建议使用任何默认值的人。NET异常消息只是建议对主题进行更改或禁用诊断功能。自定义异常文本不建议不要泄露如何攻击服务器。