2012-11-15 27 views
8

Với api đường web mặc địnhWebAPI tuyến đường 404 khi có một không gian dấu trong URL

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

và một bộ điều khiển

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

Một yêu cầu 'api/test/1'

lợi nhuận 1

Nếu vì lý do nào đó, bạn gửi yêu cầu đến 'api/test/1%20'

tuyến 404.

Bây giờ ví dụ này có vẻ ngớ ngẩn kể từ khi trình duyệt cắt dấu không gian, nhưng

cho một tuyến đường như 'api/{controller}/{id}/{extrastuff}'

không gian trong '1 ' sẽ chuyển sang '1%20' và yêu cầu sẽ 404 trên tuyến đường không được tìm thấy.

Trả lời

26

Vấn đề của bạn không liên quan gì đến WebAPI, nhưng cách Asp.Net xử lý một số url cụ thể. Và Asp.Net xử lý các url này theo cách rất hoang tưởng, vì vậy bạn cần phải thông báo cho nó to relax.

Thêm dòng này vào web.config của bạn dưới system.web:

<httpRuntime relaxedUrlToFileSystemMapping="true" /> 

Bạn có thể đọc thêm về chủ đề này:

Cũng trong ngày SO:

+0

có vẻ ngớ ngẩn rằng một động cơ MVC định tuyến sẽ được đặt thành false theo mặc định khi một lợi thế lớn của mvc là không có url liên quan đến hệ thống tệp. – Steve

+1

Nó không phải là công cụ định tuyến quyết định, đó là ASP.NET ở cốt lõi bảo vệ mọi thứ được xây dựng trên đầu trang của nó. Vì vậy, hãy cẩn thận nếu bạn thay đổi điều này mà bạn đang thư giãn các quy tắc cho tất cả mọi thứ theo ứng dụng của bạn tại thời điểm đó. –

+1

Điều này chỉ làm hỏng ứng dụng ngay sau khi tôi thêm nó – Dan

0

Thêm này để xử lý

 <add name="ExtensionlessUrlHandler-Integrated-4.0-ForApi" 
    path="api/*" 
    verb="*" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    </system.webServer> 
Các vấn đề liên quan