Javascript 如果web服务关闭,如何以JSON对象的形式返回错误消息

Javascript 如果web服务关闭,如何以JSON对象的形式返回错误消息,javascript,asp.net-mvc,Javascript,Asp.net Mvc,我在asp.net mvc web应用程序中有以下操作方法,该应用程序调用web服务并将Json结果返回给视图:- public ActionResult ListPackages() { using (var client = new WebClient()) { try{ var query = HttpUtility.ParseQueryString(string.Empty); UriBuilder("htt

我在asp.net mvc web应用程序中有以下操作方法,该应用程序调用web服务并将Json结果返回给视图:-

public ActionResult ListPackages()
{
    using (var client = new WebClient())
    {
        try{
            var query = HttpUtility.ParseQueryString(string.Empty);
            UriBuilder("http://localhost:8080/jw/web/json/workflow/package/list");
            url.Query = query.ToString();
            string json = client.DownloadString(url.ToString());
            Thread.Sleep(500);
            return Content(json, "application/json");
        }
        catch (System.Net.WebException ex) {
            return Content("Error, service is down. please try again later", "application/json");
        }
    }
}
然后在视图上,我定义了以下Ajax.Actionlink:-

@Ajax.ActionLink("Get Process List", "ListPackages", "Home",
new AjaxOptions
{
    HttpMethod = "GET",
    LoadingElementId = "tobehide",
    OnSuccess = "getpackagelist"
})
以及以下getpackagelist java脚本:-

function getpackagelist(result) {
    $('#products').empty();
    $('#title').text("All Processes");
    $.each(result.data, function (key, val) {
        var str = val.packageName;
        $('<li/>', { text: str }).appendTo($('#products'));
    });
    $('#tobehide').hide();

}
其作用方法如下:-

function getpackagelist(result) {

    if (result.error == null) {
        $('#products').empty();
        $('#title').text("All Processes");
        $.each(result.data, function (key, val) {
            var str = val.packageName;
            $('<li/>', { text: str })
                .appendTo($('#products'));
        });
        $('#tobehide').hide();
    }
    else {
        $('<li/>', { text: result.error })
                       .appendTo($('#products'));
    }
catch (System.Net.WebException) {

                    return new JsonResult()
                    {
                        Data = new { error = "Error, service is down. please try again later" }
                    };
但在WebEx怀疑被引发时,仍然不会显示任何错误。 BR

编辑

正如john G纠正我的,当然这里不会调用
OnFailure
,因为异常正在控制器中捕获。因此,要返回有效的JSON结果,请使用以下命令:

return new JsonResult() { 
    Data = new { error = "Error, service is down. please try again later" }
};
这只是创建一个匿名类型(以及
JsonResult
)作为返回任意JSON的简单方法。然后在
OnSuccess
脚本中,检查
error
属性:

function getpackagelist(result) {
    if (result.error) {
        // display error ...
    } else {
        // success ...
    }
}

使用
AjaxOptions
OnFailure
属性来处理错误场景

new AjaxOptions
{
    // ...
    OnFailure = "packagelisterror"
}
请注意,函数将传回包含
responseText
属性的JSON对象。因此,您可以使用以下方式显示错误消息:

function packagelisterror(e) {
    $("#products").html(e.responseText);
}

不确定你的代码是否能工作。因为如果您正在处理一个异常,那么on failure将不会启动,并且Onsuccess仍将启动。在这种情况下,新代码将无法工作。。我想你指的是JsonResult()而不是JsonResultContent()。@johnG是的,对。。。我认为我现在得到的答案(最后)是正确的。谢谢你的帮助。@johnG好吧。。。在从AJAX调用返回JSON字符串并接受异常的情况下,包含状态/错误字段是标准的。也许更标准的做法是简单地从服务返回一个错误代码,然后使用
OnFailure
AJAX回调来显示一条通用错误消息。@johnG我已经测试了您的编辑,它现在对我有效。我建议使用
alert(JSON.stringify(result))
检查
result
中实际发送的内容。