从jquery调用wcf服务时获取异常消息

Mar*_*tin 4 wcf jquery exception-handling

我从jquery ajax调用WCF服务.有时服务会抛出一些自定义错误,当它发生时,我需要获取该错误的消息.在我的ajax调用的错误函数中,我有以下代码:

            error: function(data) {
              alert("responseText: " + data.responseText);
            }
Run Code Online (Sandbox Code Playgroud)

抛出错误时的responseText看起来像:

responseText: {"ExceptionDetail":{"HelpLink":null,"InnerException":null,"Message":"Denied",......}}
Run Code Online (Sandbox Code Playgroud)

我想从"ExceptionDetail"获取"消息",但我不知道该怎么做.

我的WCF服务看起来像这样,测试它我只是抛出一个错误:

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public string myFunction(string id)
{
    throw new Exception("Denied");
}
Run Code Online (Sandbox Code Playgroud)

如何获取错误消息?

mar*_*c_s 6

默认情况下,WCF 不会返回任何异常细节 - 这是设计所需的功能,以免向可能的攻击者泄露太多信息.

如果要启用详细的异常消息,可以通过在服务器端启用行为来执行此操作:

 <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="debugBehavior">
          <serviceDebug includeExceptionDetailInFaults="True" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <services>
        <service name="YourService"
                 behaviorConfiguration="debugBehavior">
             .....
        </service>
    </services>
Run Code Online (Sandbox Code Playgroud)

但即使是现在 - 您需要知道WCF应该是可互操作的,因此客户端可能无法在.NET上运行 - >因此您不能简单地抛弃异常 - 这是.NET特定的构造.

您最好的选择是捕获服务器上的所有异常(使用例如IErrorHandler接口),并将它们转换为SOAP错误 - .NET异常的可互操作等效项.如果您知道另一端始终是.NET客户端,则可以轻松地将.NET异常转换为FaultException<T>T是您的.NET异常.

执行此操作时,您可以通过捕获来捕获客户端上的异常FaultException<T>,并且其.Detail属性应该包含正常的.NET异常(并且包含.Message带有异常消息的属性).