web-services - 从 WCF 项目返回有意义的异常

标签 web-services exception-handling wcf

总的来说,我对 WCF 很陌生。我从在 ASP.NET Web 应用程序中使用相当简单的 .SVC 服务获得了多少经验。

我第一次尝试尝试使用 WCF 项目,但遇到了一个主要的障碍。

我相信大多数人都知道,出于某种奇怪的原因,在 customErrors 模式设置为 On 的 Web 应用程序中

<customErrors mode = “On” />

服务(.ASMX 和 .SVC)不会向客户端返回异常详细信息。相反,异常和堆栈跟踪被清空,并且消息总是显示“处理请求时出错”,这根本没有帮助。

当服务直接托管在 Web 应用程序本身内部时,可以通过将服务放在专用文件夹中并将该文件夹的 customErrors 设置为“关闭”来轻松解决此限制。

但是,我遇到了同样的问题,异常没有从单独的 WCF 项目中的服务返回。问题是,我不知道如何解决这个问题。

简而言之:我需要让我的 WCF 项目服务向客户端冒泡真正的异常——或者至少是原始异常消息,而不是“处理请求时出错”。

编辑 :我可能应该在这里指出,我想返回异常的原因是我经常通过 Ajax (jQuery) 从客户端调用这些服务,并且如果返回消息是“正常"返回(例如,使用绿色文本),然后在出现错误时使用红色文本。我在 $.ajax 对象的错误处理程序中处理消息格式,这显然只会在服务失败时运行。

我还应该指出,当 customErrors Off 时一切正常:
<customErrors mode = “Off” />

所以,我在想,也许可以设置一些配置属性来阻止 ASP.NET 运行时在使用 customErrors 时终止我的异常。

Here是我在这方面找到的一些相关信息。

最佳答案

您还有另一种选择来捕获要冒泡给客户端的异常,并返回服务错误。

由于您必须自己设计故障契约(Contract),因此还需要进行更多的设计工作,但它使您可以灵活地将任何您想要的东西返回给客户。所以你可以设计一个契约来详细说明错误,如果你认为必要的话,堆栈跟踪。

例子:

[DataContract(Namespace = "urn:// or http://....")]
public class ClientNeedsToKnowFault
{
    [DataMember]
    public List<Error> Errors
    {
        get { return _errors; }
        set { _errors = value; }
    }

     ....
    public ClientNeedsToKnowFault() { }

    public ClientNeedsToKnowFault(string message)
    {
        Message = message;
        Errors = new List<Error>() { new Error(message) };
    }



    ...
    //Helper method to throw
     public static void ThrowFault(string message, List<Error> errorList)
    {
        throw new FaultException<ClientNeedsToKnowFault>(new ClientNeedsToKnowFault(message, errorList));
    }

一旦你设计了你的错误,你就可以向服务方法添加一个额外的属性。
[FaultContract(typeof(ClientNeedsToKnowFault))]
 void MyServiceMethod();

最后一步是扔掉它。正如你在上面看到的,我只是放了一个辅助方法来抛出它,因为我认为 FaultException 过程有点困惑。

我会说这种方法的主要缺点是必须在客户端捕获错误。但如果信息重要到足以返回错误,您可能需要这种复杂性。

关于web-services - 从 WCF 项目返回有意义的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2546492/

相关文章:

java - 应该在哪一层进行验证?

java - JMX 的用户定义异常

c++ - GCC C++ 异常处理实现

logging - 什么时候记录异常?

c# - 界面设计(WCF/远程)

json - 如何使用 JMeter 从登录到结束测试整个 Web 功能

web-services - 使用 REST API 将 Liferay Portlet 作为 Web 服务调用

java - 如何在 Spring WS 中处理语法不正确的 XML?

asp.net - 使用 Autofac 将 DI 引入 ASP.NET 应用程序中托管的 WCF 服务

jquery - 来自 jquery 的 Restful 服务调用的状态代码 405