Sie müssen Ihr eigenes Aktionsergebnis schreiben, wenn Sie die Form der Antwortnachricht anpassen möchten.
Wir wollten die gängigsten Formen von Antwortnachrichten für Dinge wie einfache leere 404s bereitstellen, aber wir wollten diese Ergebnisse auch so einfach wie möglich halten. Einer der Hauptvorteile der Verwendung von Aktionsergebnissen besteht darin, dass Ihre Aktionsmethode für Unit-Tests viel einfacher ist. Je mehr Eigenschaften wir den Aktionsergebnissen hinzufügen, desto mehr Dinge muss Ihr Komponententest berücksichtigen, um sicherzustellen, dass die Aktionsmethode das tut, was Sie erwarten.
Ich möchte oft auch die Möglichkeit haben, eine benutzerdefinierte Nachricht bereitzustellen. Sie können also einen Fehler protokollieren, damit wir in Betracht ziehen, dieses Aktionsergebnis in einer zukünftigen Version zu unterstützen:
https://aspnetwebstack.codeplex.com/workitem/list/advanced
Eine schöne Sache an den Aktionsergebnissen ist jedoch, dass Sie immer ziemlich einfach Ihre eigenen schreiben können, wenn Sie etwas anderes machen möchten. So könnten Sie es in Ihrem Fall tun (vorausgesetzt, Sie möchten die Fehlermeldung in Text / Klartext; wenn Sie JSON möchten, würden Sie etwas anderes mit dem Inhalt tun):
public class NotFoundTextPlainActionResult : IHttpActionResult
{
public NotFoundTextPlainActionResult(string message, HttpRequestMessage request)
{
if (message == null)
{
throw new ArgumentNullException("message");
}
if (request == null)
{
throw new ArgumentNullException("request");
}
Message = message;
Request = request;
}
public string Message { get; private set; }
public HttpRequestMessage Request { get; private set; }
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
return Task.FromResult(Execute());
}
public HttpResponseMessage Execute()
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.NotFound);
response.Content = new StringContent(Message); // Put the message in the response body (text/plain content).
response.RequestMessage = Request;
return response;
}
}
public static class ApiControllerExtensions
{
public static NotFoundTextPlainActionResult NotFound(this ApiController controller, string message)
{
return new NotFoundTextPlainActionResult(message, controller.Request);
}
}
Dann können Sie in Ihrer Aktionsmethode einfach Folgendes tun:
public class TestController : ApiController
{
public IHttpActionResult Get()
{
return this.NotFound("These are not the droids you're looking for.");
}
}
Wenn Sie eine benutzerdefinierte Controller-Basisklasse verwendet haben (anstatt direkt von ApiController zu erben), können Sie auch das "this" entfernen. Teil (der leider beim Aufrufen einer Erweiterungsmethode erforderlich ist):
public class CustomApiController : ApiController
{
protected NotFoundTextPlainActionResult NotFound(string message)
{
return new NotFoundTextPlainActionResult(message, Request);
}
}
public class TestController : CustomApiController
{
public IHttpActionResult Get()
{
return NotFound("These are not the droids you're looking for.");
}
}