Werfen HttpResponseException von WebApi-controller bei der Verwendung von Owin selbst hosten
Bauen wir eine WebApi, dass wir hosting mit Owin. Zuvor haben wir verwendet HttpResponseException für die Rückgabe 404-status-codes etc. in unserem controller-Aktionen und es arbeitet gut.
Jedoch, wenn wir begonnen mit Owin (selbst gehostet), die wir erleben, ein Problem mit diesem Ansatz ergeben sich in den HttpResponseException, die serialisiert werden, um json/xml und den status-code zum ändern von 404 500 (Internal Server Error). Hier der code, den wir haben:
public class InvoicesController : ApiController
{
private readonly IInvoiceRepository _invoiceRepository;
public InvoicesController(IInvoiceRepository invoiceRepository)
{
_invoiceRepository = invoiceRepository;
}
[HttpGet]
public IEnumerable<AccountCodeAssignment> AssignAccountCodesToInvoiceById(int id)
{
var invoice = _invoiceRepository.Get(id);
if (invoice == null) throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "Invoice not found"));
yield return new AccountCodeAssignment(1, ...);
yield return new AccountCodeAssignment(2, ...);
yield return new AccountCodeAssignment(3, ...);
yield return new AccountCodeAssignment(4, ...);
}
}
- und dies ist die Antwort, die wir wieder zusammen mit einem 500-response-code:
{
"Message": "An error has occurred.",
"ExceptionMessage": "Processing of the HTTP request resulted in an exception. Please see the HTTP response returned by the 'Response' property of this exception for details.",
"ExceptionType": "System.Web.Http.HttpResponseException",
"StackTrace": " at AccountCodeAssignmentService.Controllers.InvoicesController.<AssignAccountCodesToInvoiceById>d__0.MoveNext() in c:\\Projects\\AccountCodeAssignmentService\\Source\\AccountCodeAssignmentService\\Controllers\\InvoicesController.cs:line 38\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)\r\n at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)\r\n at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)\r\n at System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)\r\n at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content)\r\n at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Owin.HttpMessageHandlerAdapter.<BufferResponseContentAsync>d__13.MoveNext()"
}
Irgendwelche Ideen auf, was wir falsch gemacht oder ist HttpResponseException nicht unterstützt, wenn Owin selbst hosten?
Edit:
Einer der großen Vorteile der Verwendung von WebApi für uns ist die Fähigkeit, mit zu arbeiten und zurück unsere eigenen Typen, so möchten wir vermeiden, ändern Sie den Rückgabetyp. Wir sind derzeit nachgeben AccountCodeAssignment so ändern Sie den Rückgabetyp ist keine option.
InformationsquelleAutor Kristoffer Ahl | 2014-07-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Glaube ich nicht, das problem ist in werfen
HttpResponseException
. Wenn Sie sich auf der stack-trace du gepostet hast, scheint das problem zu sein, in den Ruf zuMoveNext()
. Dies ist eine interne C# - Darstellung deryield
Aussagen, die Sie haben.Ich könnte falsch sein, aber der einfachste Weg, um dies zu überprüfen setzen Sie einen Haltepunkt auf die erste Anweisung yield und sehen, ob es trifft. Meine Vermutung ist, dass es, d.h. es wird nicht werfen eine
HttpResponseException
. Auch, einfach den code ändern, vorübergehend zu werfen immer einHttpResponseException
und sehen, wie es verarbeitet.Ich bin derzeit an einem Projekt arbeiten, das selbst-gehosteten mit OWIN und ich werfen kann
HttpResponseException
s ohne Probleme.Auf einem verwandten beachten, haben Sie möglicherweise wollen untersuchen,Globale Ausnahmebehandlung. Ich fand es sehr nützlich, sich zu konzentrieren alle meine exception-handling an einem Ort. Beachten Sie, dass
HttpResponseException
ist ein Sonderfall und wird nicht behandelt, von der globalen exception-handler.InformationsquelleAutor djikay
Erlebte ich diese, während ich war mit postman testen der web-api und der Typ der Anfrage festgelegt wurde Klartext statt application/json.
InformationsquelleAutor dhysong
Für mich, ich fehlte-content-type-in meinem api-header. Nach dem hinzufügen der content-type application/json dieses Problem behoben für mich. Könnte anderen helfen, mit diesem.
InformationsquelleAutor briefcasejoe
Nicht 100% sicher, aber das kann geschehen, weil Ihre Aktion der Rückkehr IEnumerable<>
Versuchen es zu ändern IHttpActionResult
versuchen, diese
Sie können hinzufügen, ResponseType-Attribut bitte testen, sollte für Sie arbeitet.
Gut, der Schlüssel hier ist, dass wir nachgeben, mehrere AccountCodeAssignment ist (siehe Aktuelles Beispiel) wenn wir also ändern Sie den Rückgabetyp, der compiler wird sich beschweren! ResponseType-Attribut nicht beheben und ich würde nicht erwarten, dass es.
InformationsquelleAutor sylwester