我花了几天时间试图弄清楚如何将角度ajax请求的错误返回到web api。
在我的js Account tController中,我有一个登录方法:
$scope.Login = function () {
AccountService.Login($scope.UserData.LoginName, $scope.UserData.Password).success(function (account) {
$scope.UserData = account;
}).error(function () {
console.log("failed");
});
};
在web api中,我有以下内容:
public Account Login(string loginName, string password)
{
var emptyAccount = new Account();
password = Encrypt(password);
var account = db.Accounts.FirstOrDefault(c=>c.Password == password && c.LoginName == loginName);
if (account == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
acount.Password = "";
return account;
}
问题是我抛出了一个新的HttpResponse seException,它会触发并且不会将任何内容返回给ajax。我该如何解决这个问题?
通常,在这种情况下,将触发错误处理程序。
.error(function () {
alert("login failed");
}
这是您可以处理错误的地方。
在这种情况下,您可能还希望返回401 Un授权
而不是404。此外,通常认为在可以优雅处理的情况下抛出异常是不好的做法:
public HttpResponseMessage Login(string loginName, string password)
{
var emptyAccount = new Account();
password = Encrypt(password);
var account = db.Accounts.FirstOrDefault(c => c.Password == password && c.LoginName == loginName);
if (account == null)
{
return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "unauthorized");
}
acount.Password = "";
return Request.CreateResponse(HttpStatusCode.OK, account);
}
当您发送数据并击中服务器时,它将返回标头200 OK,因为它已经击中您的控制器,即使您的控制器代码抛出错误(在以后的过程中)。
因此,如果您想知道抛出了什么错误,我将在其中创建Account tResponse Dto,并在其中引入新的Error字段,如下所示:
public class AccountResponse()
{
public Account account { get; set;}
public string ErrorMessage { get; set; }
}
然后在控制器上:
public AccountResponse Login(string loginName, string password)
{
var emptyAccount = new Account();
password = Encrypt(password);
var account = db.Accounts.FirstOrDefault(c=>c.Password == password && c.LoginName == loginName);
if (account == null)
{
return new AccountResponse(){ ErrorMessage = Response.ResponseCodes.something;
}
AccountResponse.account = account;
AccountResponse.account.Password = "";
return AccountResponse;
}