2013-06-02 26 views
13

Tôi đang sử dụng MVC4 và cần để định tuyến một yêu cầu như thế này để một bộ điều khiển:Routing một url với phần mở rộng trong MVC4 sẽ không làm việc, cố gắng để phục vụ lên tập tin tĩnh

[myapp]/data/fileinfo.xml

Đây là con đường tôi đã cấu hình:

routes.MapRoute(
      name: "Data", 
      url: "Data/{file}", 
      defaults: new { controller = "Data", action = "fileinfo"} 
     ); 

Bây giờ, công trình này hoàn toàn tốt đẹp và các tuyến đường yêu cầu DataController tôi nếu URL không bao gồm phần mở rộng .xml, nhưng ngay sau khi một phần mở rộng được sử dụng, IIS cố gắng để phục vụ lên một tệp tĩnh (thay vì định tuyến đến bộ điều khiển của tôi) và tôi gặp lỗi 404.

Tôi đã đọc vô số câu hỏi/câu trả lời về vấn đề này trực tuyến và mọi giải pháp tôi đã thử đều không thành công. Ví dụ: tôi đã thử sử dụng RouteExistingFiles = true khi định cấu hình RouteCollection của mình và tôi đã thêm <modules runAllManagedModulesForAllRequests="true" /> vào web.config, nhưng không có kết quả.

Nếu bất cứ ai có ý tưởng về những gì tôi nên thử hoặc những gì tôi có thể bị thiếu, nó sẽ được nhiều đánh giá cao. Tôi đang sử dụng asp.Net 4.5, VS 2012 và IIS 8.0.

Trả lời

10

Bạn có thể thêm video này vào web.config của bạn trong phần <system.webServer><handlers>:

<add name="ManagedDllExtension" 
    path="data/fileinfo.xml" 
    verb="GET" type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" /> 

Tuyến đường của bạn sẽ

routes.MapRoute(
     name: "Data", 
     url: "Data/fileinfo.xml", 
     defaults: new { controller = "Data", action = "fileinfo"} 
    ); 

Ngoài ra còn có <modules runAllManagedModulesForAllRequests="true"> nhưng nó dường như không làm việc cho MVC4/IIS8 (được sử dụng để được ok trong MVC3/IIS7 IIRC). Thông tin thêm here. Ngoài ra còn có một tác động hiệu suất với điều này vì mọi yêu cầu sẽ định tuyến qua đường ống được quản lý.

HTH

+1

Cảm ơn phản hồi của bạn, tôi thực sự đánh giá cao nó. :) Sau khi thử điều này, tôi sẽ nhận được lỗi 500 khi truy cập url. Thông báo lỗi nói rằng IIS có khả năng nhận được yêu cầu và sau đó thất bại bằng cách nào đó với mô-đun xử lý yêu cầu (chi tiết lỗi tham chiếu ManagedDllExtension và mô-đun ManagedPipelineHandler, nhưng hơi quá mơ hồ để có ích cho tôi). – user2445698

+0

Trong thời gian chờ đợi, tôi đã tìm thấy cách giải quyết khả thi (có thể không đẹp, nhưng nó hoạt động). Tôi đang bắt /data/fileinfo.xml trong Global.asax.cs và sử dụng Context.RewritePath() để cắt phần mở rộng. Sau đó, định tuyến có thể hoạt động bình thường. Cảm ơn bạn đã giúp đỡ. – user2445698

+0

Ah đó là một điều đáng tiếc - đã làm việc hoàn hảo trên máy của tôi :-). Vui mừng khi biết bạn có một giải pháp. Bạn luôn có thể cấu trúc lại vào một ngày sau đó! –

0

tôi đã cùng một vấn đề với ASP MVC 4. Trong phần web.config syste.webserver.handlers tôi thấy mã tiếp theo:

<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 

Tất cả các yêu cầu mà có .ext sẽ xử lý tự động bởi IIS. Những người bị mất tích trong MVC 3.

+0

Như tên cho thấy, tất cả các URL không mở rộng sẽ được xử lý bởi điều này, trong khi câu hỏi dường như có nhiều URL hơn với phần mở rộng.Hơn nữa hai trình xử lý này sẽ hoạt động đặc biệt khi nhóm ứng dụng IIS đang chạy ở chế độ cổ điển. –