如何使用故障契约和 jquery ajax 处理 wcf 错误

Posted

技术标签:

【中文标题】如何使用故障契约和 jquery ajax 处理 wcf 错误【英文标题】:how to handle wcf errors using fault contract and jquery ajax 【发布时间】:2016-01-04 14:42:18 【问题描述】:

我在互联网上搜索了很多,但找不到任何解决我的问题的方法。

问题

我创建了两个应用程序。一种是 WCF 服务应用程序,另一种是通过 jQuery Ajax 消费 WCF 服务操作的主应用程序。 一切正常。最后,我想通过在 WCF 服务中添加错误处理代码来完成任务。 现在,我在 WCF 服务中添加了“故障契约”,但无法理解如何将错误从服务直接传递给 jQuery ajax。目前,自定义错误消息未传递,常规服务错误消息“Bad Request”正在传递。

WCF 服务代码

[ServiceContract]
public interface IAdmin_UserDet

    [OperationContract]
    [FaultContract(typeof(ErrorHandler))]
    string getData();


[DataContract]
public class ErrorHandler

    [DataMember]
    public string message  get; set; 
    [DataMember]
    public string methodName  get; set; 
    [DataMember]
    public int lineNumber  get; set; 
    [DataMember]
    public string errorDateTime  get; set; 


[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class Admin_UserDet : IAdmin_UserDet

    [WebInvoke(Method = "GET", UriTemplate = "returnData", ResponseFormat = WebMessageFormat.Json)]
    public string getData()
    
        try
        
            int num1 = 2;
            int num2 = 0;

            int res = num1/num2;
            return res.ToString();
        
        //catch(FaultException<ErrorHandler> objErr)
        catch(Exception ex)
        
          ErrorHandler objErr = new ErrorHandler();
          objErr.message = "division by zero";
          objErr.methodName = "getData";
          //return objErr.Detail.message + " | " + objErr.Detail.methodName;
          throw new FaultException<ErrorHandler>(objErr);
        
    

jQuery Ajax 代码(我通过它调用服务)

var wcfUrl = "http://localhost/VMService/Admin_UserDet.svc/";

 $('button[id=btnTest]').click(function () 
   $.ajax(
        type: "GET",
        url: wcfUrl + "returnData",
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function (response) 
                     alert("no error");
                     console.log(response);
        ,
        error: function (e) 
                     console.log(JSON.parse(e.responseText));
        
    );
);

运行应用程序后收到的错误消息

GET http://localhost/VMService/Admin_UserDet.svc/returnData 400 (Bad Request)

但是,我希望错误消息为“除以零 | getData”,它已在 getData 方法中设置。

请指导我确切的方式/任何链接,我可能会从中了解如何处理来自 jquery ajax 的 WCF 错误。

谢谢。

【问题讨论】:

您在 .Net 客户端中使用 FaultException,对于您的 ajax 客户端,抛出一个简单的异常 好的。您的意思是说,如果我在 .NET 客户端中使用服务(创建代理类的对象),我将使用 FaultException。对于这种情况,由于我通过 jquery ajax 消费,所以我不需要使用“FaultException”,简单的异常对我有用。我说的对吗? 是的,没错。还有一些其他的方法,例如实现 IErrorHandler,或者如果你使用 json/rest 方法,你可以在响应对象中返回错误。 其实我用的是json方法。我只是在 catch 部分放了一条简单的文本消息,它正在返回到我的 jquery ajax 方法。没关系。但是,我注意到它来自 jquery ajax 的成功函数而不是错误函数。从技术上讲,它应该在错误函数中,不是吗?因为,在服务中,它进入了catch(),所以这意味着发生了异常,然后它应该进入jquery ajax error()而不是success()。如果它进入success(),我可以处理,这不是问题。但是,我想了解流程的实际工作方式。 实现 IErrorHandler 它将为 jQuery 返回正确的 json 错误并通过行为注入它。请参阅我的答案中的以下链接。 【参考方案1】:

我相信这已被回答here,尽管这未被标记为答案。 我个人使用了相同的方法,非常适合我。

【讨论】:

以上是关于如何使用故障契约和 jquery ajax 处理 wcf 错误的主要内容,如果未能解决你的问题,请参考以下文章

jQuery AJAX API 交互。如何使用 html 视图处理数据输出?

如何防止 WCF 服务进入故障状态?

我如何知道 jQuery 是不是有待处理的 Ajax 请求?

如何在没有 Ajax 的 JQuery DataTables 中使用服务器端处理

如何在 Sharepoint 2010 中使用 HTTP 处理程序发出 jQuery AJAX 请求?

如何 jQuery Ajax 错误捕获和报告