如何从webmethod向AJAX调用返回exception?

我从[WebMethod]返回List 。 但是当exception发生时如何将failure消息返回给AJAX调用者? 现在我遇到了构建错误。

JS:

 $.ajax({ type: 'POST', contentType: "application/json; charset=utf-8", url: 'new.aspx/GetPrevious', data: "{'name':'" + username + "'}", async: false, success: function (data) { Previous = data.d; alert(salts); }, error: function () { alert("Error"); } }); 

C#:

 [WebMethod] public static List GetPreviousSaltsAndHashes(string name) { try { List prevSalts = new List(); if (reader.HasRows) { while (reader.Read()) { prevSalts.Add(reader.GetString(0)); } } conn.Close(); return prevSalts; } catch (Exception ex) { return "failure"; //error showing here } } 

WebMethod抛出的所有exception都会自动序列化为响应,作为.NET Exception实例的JSON表示forms。 您可以查看以下文章以获取更多详细信息。

所以你的服务器端代码可能会有点简化:

 [WebMethod] public static List GetPreviousSaltsAndHashes(string name) { List prevSalts = new List(); // Note: This totally sticks. It's unclear what this reader instance is but if it is a // SqlReader, as it name suggests, it should probably be wrapped in a using statement if (reader.HasRows) { while (reader.Read()) { prevSalts.Add(reader.GetString(0)); } } // Note: This totally sticks. It's unclear what this conn instance is but if it is a // SqlConnection, as it name suggests, it should probably be wrapped in a using statement conn.Close(); return prevSalts; } } 

在客户端:

 error: function (xhr, status, error) { var exception = JSON.parse(xhr.responseText); // exception will contain all the details you might need. For example you could // show the exception Message property alert(exception.Message); } 

在一天结束时,在说完所有这些内容后,您应该知道WebMethods是一种完全过时且过时的技术,除非您维护一些现有代码,否则您绝对没有理由在新项目中使用它们。

您可以返回带有正文(您的实际数据)的通用结构,状态代码和错误字段来描述exception(如果有)。 然后在JS方面,您只需使用正文或错误字段,具体取决于状态代码。 这就是我在上一次肥皂网服务中使用的内容。

确保在两种情况下都返回相同的类型。 将您的失败更改为列表:

 List prevSalts = new List(); try { ... } catch (Exception ex) { prevSalts.Clear(); prevSalts.Add("failure"); } return Json(new { salts = prevSalts }, JsonRequestBehavior.AllowGet); 

编辑:要在前端获取字符串,请使用适当的方法进行检查

 success: function (data) { Previous = data.salts alert(salts); }, error: function (data) { $.each(data.salts, function(index,item) { alert(item); }); }