7

Chcę być w stanie przejąć odpowiedź 404 z interfejsu webowego (iis), gdy zasób nie istnieje.Web API 2.2 zwraca niestandardowe 404, gdy nie znaleziono zasobu (URL)

zrobiłem moje badania i natknąłem się tylko one solution że wykonany tej pracy, ale nie jestem pewien, w jaki sposób „bezpieczne” jest od „routeTemplate” jest tylko {* url}

Ten post jest trochę do prosić o pomoc i wyjaśnienia.

Moja aplikacja używa MVC i WebAPI ... czy ten szablon wpłynie również na MVC? Czy istnieje sposób dodawania "api" z {* url} w szablonie? (Aby upewnić się, prosi tylko o „.../api/...” uzyskać wpływ)

config.Routes.MapHttpRoute("Error404", "{*url}", new { controller = "Error", action = "Handle404" }); 

ktoś natknąć czystszego sposobu prowadzenia tego postępowania i 404 w Web API?

EDIT 1

Powyższy kod ma wpływu na moje trasy MVC. Jak mogę dodać "api" do "{* url}"? ... jeśli próbowałem na wiele różnych sposobów i nie ma kości.

+0

Czy próbowałeś "{api/* url}" lub "{api * url}" itd ..? –

+0

Miałem ten sam problem, strona używająca zarówno interfejsu webowego, jak i MVC. Postępowanie zgodnie z instrukcjami w artykule, który łączyłeś, przerwie routing MVC. Rozwiązaniem jest zmiana szablonu trasy na "api/{* url} –

Odpowiedz

5

Miał dokładnie ten sam problem. Po kilku badaniach i próbach i błędach udało mi się znaleźć działające rozwiązanie.

Poszedłem z rozwiązaniem RoutePrefix i próbowałem zaimplementować coś podobnego do tego, w jaki sposób używane kontrolery MVC używały HandleUnknownAction w kontrolerze bazowym.

Z pomocą tego postu: .NET WebAPI Attribute Routing and inheritance celu umożliwienia dziedziczenia trasy, stworzyłem podstawowy kontroler dla moich API internetowych z HandleUnknownAction sposobu jak ten:

public abstract class WebApiControllerBase : ApiController { 

    [Route("{*actionName}")] 
    [AcceptVerbs("GET", "POST", "PUT", "DELETE")]//Include what ever methods you want to handle 
    [AllowAnonymous]//So I can use it on authenticated controllers 
    [ApiExplorerSettings(IgnoreApi = true)]//To hide this method from helpers 
    public virtual HttpResponseMessage HandleUnknownAction(string actionName) { 
     var status = HttpStatusCode.NotFound; 
     //This is custom code to create my response content 
     //.... 
     var message = status.ToString().FormatCamelCase(); 
     var content = DependencyService 
      .Get<IResponseEnvelopeFactory>() 
      .CreateWithOnlyMetadata(status, message); 
     //.... 
     return Request.CreateResponse(status, content); 
    } 
} 

Jeśli nie chcesz przejdź ścieżką dziedziczenia, możesz zawsze umieścić metodę bezpośrednio w kontrolerze, na którym chcesz zastosować tę funkcję.

To pozwala mi używać prefiksów tras, które obsługują niestandardowe wiadomości nie znalezione, które odnoszą się do konkretnych kontrolerów, ponieważ mam zarówno interfejsy zaplecza, jak i ogólnodostępne interfejsy API.

Jeśli adres URL nie ma zastosowania do ApiContoller, domyślny kontroler błędów obsłuży nie znalezione jak zwykle.