Ich versuche benutzerdefinierte Fehlerantworten von web.api zurückzugeben. Lass es einfach String "Oops!"
als JSON formatiert sein. Also habe ich einfach delegierenden Handler, die Fehlerreaktionen wie folgt ersetzt:Inhalt fehlt für 404 Antworten
public class ErrorMessageHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
var response = await base.SendAsync(request, cancellationToken);
if (response.IsSuccessStatusCode)
return response;
var formatter = new JsonMediaTypeFormatter();
var errorResponse = request.CreateResponse(response.StatusCode, "Oops!", formatter);
return errorResponse;
}
}
Weiter stelle ich sicher, dass dies die einzige Message-Handler in der Pipeline:
httpConfig.MessageHandlers.Clear();
httpConfig.MessageHandlers.Add(new ErrorMessageHandler());
// Only default route
httpConfig.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
app.UseWebApi(httpConfig); // OWIN self-hosting
Controller ist auch einfachste:
public class ValuesController : ApiController
{
public IHttpActionResult Get(int id)
{
if (id == 42)
return Ok("Answer to the Ultimate Question of Life, the Universe, and Everything");
return NotFound();
}
}
Und hier geht interessant:
/api/values/42
gibt mir 200 Antwort mit String-Wert/api/values/13
gibt mir 404-Antwort mit meinem benutzerdefinierten"Oops!"
String/api/values/42/missing
mir leer 404 Antwort
Der letzte Fall gibt, ist mein Problem. Wenn ich einen Haltepunkt in der letzten Zeile des delegierenden Handlers einstelle, sehe ich klar, dass errorResponse
ObjectContent<string>
mit dem korrekten Wert enthält. Aber warum wird dieser Wert später weggeräumt?
Damit Sie sicher sind, dass „/ api/Werte/42/fehlt“ trifft Handler ? Ich habe das in meiner Umgebung getestet (die nicht die gleiche ist wie deine, aber trotzdem) und für mich wird dieser Handler vollständig umgangen und die Antwort wird von IIS geliefert. – Evk
Vielleicht ein Routing-Problem? Ich muss etwas lesen, aber vielleicht wird der 'DelegierendeHandler' ausgeführt, aber ein Downstream-Event quetscht die Antwort aufgrund der unbekannten Route? Es scheint, dass 'HttpRoutingDispatcher' nach dem benutzerdefinierten Handler ausgeführt wird, wie in [Asp.Net docs] (https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/http-message-handlers). – claylong
@Evk ja, ganz sicher. Handler erhält eine Antwort mit 'HttpError', die besagt, dass für diese Anfrage keine Routendaten gefunden wurden. Dann wird diese Antwort durch die neue 'errorResponse' ersetzt und in die Pipeline zurückgegeben (ich nehme an, sie sollte auf 'HttpServer' gehen). Vielleicht ist es ein Problem? –