我正在通过UI进行Ajax调用,如下所示
$.ajax({
type: "GET",
dataType: "json",
url: "api/ChangePassWord",
data: source,
success:
function (data) {
ChangePasswordSuccess(data);
},
error: function (err) {
Error(err);
}
});
function Error(err) {
alert(err.Error);
}
我的控制器代码如下所示
[HttpGet]
public void ChangePassWord(string Email,string pwd)
{
try
{
//A call to WCF Service
wcfClinetProxy.ChangePassWord(Email, pwd);
}
catch (Exception ex)
{
throw new Exception("Error while changing PassWord", new Exception(ex.InnerException.Message));
//ModelState.AddModelError(string.Empty, ex.Message);
}
}
从WebAPi控制器我正在调用WCF服务来更改PassWord.If PassWord没有足够的长度WCF服务将抛出异常的原因.In Controller我想捕获异常并在UI中显示为alert.Please建议我这样做的好方法。
答案 0 :(得分:0)
如果您可以选择在JavaScript中验证输入,我建议您验证其中的长度。
编辑: 此外,也许这就是您所寻找的:https://msdn.microsoft.com/en-us/library/ee942778.aspx
答案 1 :(得分:0)
使用当前代码,当您的代码崩溃并点击catch
块时,您将抛出一个新的异常。框架会将此异常详细信息发送回客户端。因此,从web api调用中获得的结果将是 500 内部错误状态的响应,响应正文具有异常详细信息
{
"Message":"An error has occurred.",
"ExceptionMessage":"Error while changing PassWord"
"ExceptionType":"Some value for this",
"StackTrace": "importane stack trace information here"
}
这有很多信息,包括Stacktrace。将这些信息暴露给客户端/最终用户可能不是一个好主意。您的公共端点应该向用户返回友好响应,而不是向他提供堆栈跟踪和异常详细信息。
由于响应不是 200 OK 响应,因此将调用error
方法的$.ajax
处理程序。
理想情况下,您应该做的是,始终返回您自己的自定义响应(具有200 OK状态),该响应具有客户端所需的信息。例如,如果一切顺利,请返回这样的回复
{ status: "success" }
如果代码命中了catch块,则返回类似
的内容{ status: "failed", message: "failed to update password" }
此外,对于任何更新数据的内容,您的端点不应是GET端点。使其仅适用于http POST
public class ChangePasswordController : ApiController
{
public class LoginVm
{
public string Email { set; get; }
public string Pwd { set; get; }
}
[HttpPost]
public HttpResponseMessage Post([FromBody] LoginVm vm)
{
try
{
wcfClinetProxy.ChangePassWord(vm.Email, vm.Pwd);
return Request.CreateResponse(HttpStatusCode.OK,new {status = "success"});
}
catch (Exception ex)
{
// to do : Log the error (ex) to your error logs
return Request.CreateResponse(HttpStatusCode.OK,
new { status = "failed", message="failed t update" });
}
}
}
现在在客户端,您将对端点进行POST调用,当响应返回时,我们将检查status
属性,如果status属性的值为failed
,我们将向用户显示message
属性值。
$.ajax({
type: 'POST',
url: 'api/ChangePassword',
data: { email: 'scott', pwd: 'tiger' }
}).done(function (r) {
if (r.status === 'failed') {
alert(r.message);
} else {
alert("Updated successfully");
}
}).fail(function (x, a, e) {
console.log(x);
console.log(a);
console.log(e);
});