带有内容类型响应的自定义错误消息

时间:2017-03-21 08:27:12

标签: angularjs asp.net-web-api angularjs-http

我试图在我的MCV AngularJS应用程序中实现一些错误处理,但遇到了这个我不确定如何解决的问题。

结构
在我的AngularJS服务ticketService中,我有以下方法:

this.downloadFile = function (fileId) {
    return $http.get(baseUrl + "/Downloadfile/" + fileId, { responseType: "blob" });
}

在我的控制器中:

$scope.downloadFile = function (fileId) {
    ticketService.downloadFile(fileId)
        .then(function (response) {
            // Handle correct request and response
        }, function (err) {
            // Handle error
            notify({ message: "Something went wrong: " + err.data.Message, position: "center", duration: 10000 });
        })
}

这是我从后端MVC Web API方法返回的内容:

var error = new HttpError("Failed to find file, bla bla bla.");
return Request.CreateResponse(HttpStatusCode.NotFound, error);

问题
我的问题是,由于我的responseType设置为blob,因此我的err对象的响应类型相同。我相信我的后端服务应该可以覆盖此响应类型,并使用包含一些Message的对象进行响应。

从这个回复中,我会认为我可以得到err.data.Message,但也许我误解了这种情况?

提前谢谢。

2 个答案:

答案 0 :(得分:0)

public HttpResponseMessage Get(int id)
    {
        try
        {
            return Request.CreateResponse(HttpStatusCode.OK, new { Status = 
                   "OK", Message = this._myContext.GetCustomer(id) });
        }
        catch(Exception e)
        {
            return Request.CreateResponse(HttpStatusCode.Conflict, new { 
                   Status = "NO", Message = e.ToString() });
        }
    }

您可以返回任何消息,例如“找不到文件,bla bla bla”。在消息中。然后你只需要检查ajax成功方法,如 data.Message

答案 1 :(得分:0)

$ http服务使用的XHR API无法动态更改responseType

您可以设置状态消息并使用:

public ActionResult Foo() 
{ 
    Response.StatusCode = 403;
    Response.StatusDescription = "Some custom message";

    return View(); // or Content(), Json(), etc
}

然后在AngularJS中:

$scope.downloadFile = function (fileId) {
    return ticketService.downloadFile(fileId)
      .then(function (response) {
            // Handle correct request and response
            return response.data;
    }).catch(function (response) {
            // Handle error
            console.log(response.status);
            console.log(response.statusText);
            throw response;
    });
};

替代方法是:

  1. 使用具有更强大和灵活功能集的Fetch API
  2. 使用FileReader APIJSONparse() methodBlob转换为JavaScript Object