7

Desidero essere in grado di rilevare la risposta 404 da web api (iis) quando la risorsa non esiste.Web API 2.2 restituisce 404 personalizzato quando la risorsa (URL) non viene trovata

ho fatto la mia ricerca e mi sono imbattuto solo one solution che ha fatto questo lavoro, ma non sono sicuro di come "sicuro" è quanto il "routeTemplate" è solo {* url}

Questo post è un pò a chiedere aiuto e spiegazioni

La mia app utilizza MVC e WebAPI ... questo modello influenzerebbe anche MVC? C'è un modo per aggiungere "api" con {* url} nel modello? (Per assicurarsi che solo le richieste con ".../api/..." ottenere colpite)

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

Qualcuno ha incontrato un modo più pulito di fare questo e movimentazione 404 in API Web?

EDIT 1

Il codice di cui sopra influisce miei percorsi MVC. Come posso aggiungere "API" a "{* url}"? ... se provato in molti modi diversi e senza dadi.

+0

Hai provato "{api/* url}" o "{api * url}" ecc.? –

+0

Ho avuto lo stesso problema, sito che utilizza sia web api che MVC. Seguendo le istruzioni nell'articolo a cui sei collegato interromperà il tuo routing MVC. La soluzione è di cambiare il modello di percorso in "api/{* url} –

risposta

5

Aveva lo stesso identico problema. Dopo alcune ricerche e prove ed errori, sono riuscito a trovare una soluzione funzionante.

Sono andato con una soluzione RoutePrefix e ho provato a implementare qualcosa di simile a come i controller MVC utilizzavano HandleUnknownAction in un controller di base.

Con l'aiuto da questo post: .NET WebAPI Attribute Routing and inheritance per consentire per la rotta eredità, ho creato un controller di base per le mie API web con un metodo HandleUnknownAction come questo:

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); 
    } 
} 

Se non si vuole andare lungo il percorso di ereditarietà, è sempre possibile inserire il metodo direttamente nel controller su cui si desidera applicare la funzionalità.

Questo mi consente di utilizzare i prefissi di route che gestiscono i messaggi personalizzati non trovati che riguardano specifici controller in quanto ho sia le API di back-office che quelle pubbliche pubbliche.

Se un URL non si applica a un ApiContoller, il controller Errore predefinito gestirà il non trovato come al solito.

Problemi correlati