2012-11-15 6 views
8

con l'API Web predefinito percorsopercorso WebAPI 404, quando v'è uno spazio finale nell'URL

config.Routes.MapHttpRoute(
      name: "API Default", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new 
         { 
          id = RouteParameter.Optional 
         } 
      ); 

e un controller

public class TestController : ApiController 
{ 
    [HttpGet] 
    public HttpResponseMessage Get(string id) 
    { 
     return Request.CreateResponse(HttpStatusCode.OK, id); 
    } 
} 

Una richiesta di 'api/test/1'

rendimenti 1

Se per qualche motivo si invia una richiesta a 'api/test/1%20'

il percorso 404's.

Ora questo esempio può sembrare sciocco dal browser assetto spazi finali, ma

per un percorso come 'api/{controller}/{id}/{extrastuff}'

lo spazio in '1 ' sarebbe convertire '1%20' e la richiesta sarà 404 sul percorso, non essere trovati.

risposta

26

Il tuo problema non ha nulla a che vedere con WebAPI stesso, ma come Asp.Net gestisce alcuni URL specifici. E Asp.Net gestisce questi URL in modo molto paranoico, quindi è necessario dirlo allo to relax.

Aggiungere questa riga al vostro web.config sotto system.web:

<httpRuntime relaxedUrlToFileSystemMapping="true" /> 

Si può leggere di più su questo argomento:

anche su SO:

+0

sembra stupido che un motore di routing MVC sarebbe è impostato su false di default quando un enorme vantaggio di mvc è di non avere l'url correlato al file system. – Steve

+1

Non è la decisione dei motori di routing, è ASP.NET al centro della protezione di tutto ciò che è stato costruito su di esso. Quindi, fai attenzione se cambi questo in questo modo stai rilassando le regole per ogni cosa sotto la tua applicazione. –

+1

Arresto anomalo dell'applicazione appena lo aggiungo – Dan

0

Aggiungere questo ai gestori

 <add name="ExtensionlessUrlHandler-Integrated-4.0-ForApi" 
    path="api/*" 
    verb="*" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    </system.webServer>