Jeśli żądany zasób nie zostanie znaleziony przez warstwę usługi zwracającą wartość null do kontrolera Web API; jaki jest najlepszy sposób na przesłanie odpowiedzi do klienta bez twardego kodowania jej w kontrolerze i sprawdzanie, czy jest ona zerowa?ASP.NET Web API i kod stanu dla zerowej odpowiedzi
8
A
Odpowiedz
15
Osobiście po prostu wykonuję kontrole w kontrolerach zgodnie z komentarzem Oppozycyjnym, ale to, o co prosisz, jest całkowicie uzasadnione. Ponownie za pomocą filtrów działania albo przymocowane na kontroler (lub zarejestrowanym globalnie) można zrobić coś wzdłuż tych linii:
Przykład Model:
public class Foo
{
public string Bar { get; set; }
}
Przykład Kontroler:
public class FoosController : ApiController
{
[NullObjectActionFilter]
public Foo Get(string id)
{
// - Returns model and 200
//return new Foo() { Bar = "TEST" };
// - Returns 404
//return null;
}
}
Filtr:
public class NullObjectActionFilter : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
object outValue = null;
actionExecutedContext.Response.TryGetContentValue<object>(out outValue);
if (outValue == null)
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
base.OnActionExecuted(actionExecutedContext);
}
}
11
Zgadzam się z Markiem, że ActionFilter jest drogą do zrobienia - Małe metody działania są dobrym zapachem.
Jednak HttpActionExecutedContext.Response
może być null
kiedy wystąpi wyjątek; a klasa NullObjectActionFilter pokazana powyżej może ukrywać kody stanu błędów HTTP. Lepiej sprawdź, czy udało się zakończyć pomyślnie i udany kod HTTP.
Oto filtr działanie używam:
/// <summary>
/// Converts <c>null</c> return values into an HTTP 404 return code.
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class NullResponseIs404Attribute : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
if ((actionExecutedContext.Response != null) && actionExecutedContext.Response.IsSuccessStatusCode)
{
object contentValue = null;
actionExecutedContext.Response.TryGetContentValue<object>(out contentValue);
if (contentValue == null)
{
actionExecutedContext.Response = actionExecutedContext.Request.CreateErrorResponse(HttpStatusCode.NotFound, "Object not found");
}
}
}
}
Powiązane problemy
- 1. Asp.net Web Api ustawić kod stanu odpowiedzi na numer
- 2. Kod stanu odpowiedzi sieciowej
- 3. ASP.NET Web API usuwające HttpError z odpowiedzi
- 4. ASP.NET Web API CacheControl
- 5. ASP.NET Web Api i UrlDecode
- 6. Jednolite, spójne odpowiedzi na błędy z ASP.Net Web API 2
- 7. Niestandardowy MVC AuthorizeAttribute dla ASP.NET Web API
- 8. Czy istnieje HttpControllerBuilder dla ASP.NET Web API?
- 9. Uwierzytelnianie systemu Windows i Asp.Net Web API
- 10. Uwierzytelnianie ASP.NET Web API
- 11. ASP.NET Web API i [Serializable] klasa
- 12. Autofac i ASP.NET Web API ApiController
- 13. uwierzytelniania z ASP.NET Web API
- 14. ASP.NET Web API - XML w camelcase
- 15. ASP.NET Web API personalizuj Pomoc
- 16. Rozwiązanie do porównywania odpowiedzi Web Api?
- 17. Yii2 reszta api nie zwraca kod odpowiedzi i status
- 18. ASP.NET Web API Wystąpił błąd
- 19. ASP.NET Web Api - Autoryzacja z wartości kwerendy i bezpieczeństwa API
- 20. Jak wysłać kod stanu 500 w ASP.Net i nadal pisać do odpowiedzi?
- 21. CORS i non 200 kod stanu
- 22. Transakcje z ASP.net WEB API
- 23. ASP.NET Web API multiple RoutePrefix
- 24. Zmiany nagłówków odpowiedzi na typ nośnika Formatter dla ASP.NET Web API
- 25. Asp.net Web API - zwróć dane z actionfilter
- 26. Powrót plik z ASP.NET Web API 5
- 27. Kod stanu HTTP dla ograniczonej kolekcji?
- 28. Kod stanu HTTP dla niepoprawnych danych
- 29. Strumień postów w ASP.NET Core Web Api
- 30. ASP.Net Web API - nagłówek nagłówka autoryzacji
Można też zwrócić komunikat odpowiedzi o statusie NOTFOUND wewnątrz metody działania kontroler; lub możesz po prostu wyrzucić wyjątek i mieć globalny filtr odwzorowujący typ wyjątku na odpowiednią odpowiedź. Nie jestem pewien, dlaczego sprawdzanie wartości zerowej byłoby problemem, logika działania kontrolera musi obsługiwać różne warunki i mapować je do odpowiedzi z odpowiednim kodem statusu. – Oppositional
Mam filtr globalny, tak jak powiedziałeś. Nie chcę mieć tych zerowych sprawdzeń w każdej akcji kontrolera. –