2017-03-21 4 views
0

Ich versuche, einige Fehlerbehandlung in meine MCV AngularJS-Anwendung zu implementieren, stieß aber auf dieses eine Problem, das ich nicht sicher bin, wie zu lösen.Benutzerdefinierte Fehlermeldung mit Content-Type-Antwort

Struktur
In meinem AngularJS Service ticketService Ich habe die folgende Methode:

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

Und in meinem Controller:

$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 }); 
     }) 
} 

Hier ist, was ich aus der Backend-MVC Web-API-Methode zurückgeben :

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

Problem
Mein Problem ist, dass seit meinem responseType gesetzt blob zu sein, mein err Objekt ist der gleiche Antworttyp. Ich würde glauben, dass es für meinen Back-End-Dienst möglich sein sollte, diesen Antworttyp zu überschreiben und mit einem Objekt zu antworten, das einige Message enthält.

Von dieser Antwort hätte ich gedacht, dass ich err.data.Message bekommen könnte, aber vielleicht habe ich dieses Szenario missverstanden?

Vielen Dank im Voraus.

+0

Haben Sie mit "HttpResponseMessage" in der API-Methode überprüft? –

+0

Ich bin mir nicht sicher, wie man eine benutzerdefinierte Nachricht auf das 'HttpResponseMessage'-Objekt anwendet. Ist das nur auf den Inhalt? – Detilium

+0

@BasantaMatia 'HttpResponseMessage' gibt mir das gleiche Problem. Immer noch sind meine Antwort Typ und Objekt vom Typ 'Blob' – Detilium

Antwort

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() }); 
     } 
    } 

Sie jede Nachricht zurückgeben kann, wie "Datei zu finden ist fehlgeschlagen, bla bla bla." in Nachricht. Dann brauchen Sie nur in Ajax-Erfolg Methode zu überprüfen, wie data.Message,

+0

Das wird also nicht mein Fehler Rückruf treffen? – Detilium

0

Die $ http-Dienst verwendet die XHR API, die der Änderung der responseType on the fly nicht in der Lage ist.

können Sie die Statusmeldung gesetzt und verwenden Sie diese:

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

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

Dann in 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; 
    }); 
}; 

Alternative Ansätze sind:

  1. Verwenden Sie die Fetch API, die eine leistungsfähigere hat und flexibler Funktionsumfang.
  2. Verwenden Sie die FileReader API und JSONparse() method, um die Blob in eine JavaScript Object zu konvertieren.
Verwandte Themen