2010-03-11 34 views
21

Tôi có một ứng dụng ASP.NET MVC nơi trang mặc định phải là index.html là một tệp thực trên đĩa.ASP.NET MVC không phục vụ tài liệu mặc định

tôi có thể duyệt đến tập tin sử dụng www.mydomain.com/index.html vì vậy tôi biết nó sẽ được phục vụ và tồn tại nhưng nếu tôi sử dụng www.mydomain.com tôi nhận được một 404.

tôi đã đảm bảo rằng tài liệu mặc định được đặt chính xác trong IIS7 và tôi thậm chí đã đi xa đến mức nhận xét tất cả các tuyến được định nghĩa trong global.asax của tôi để đảm bảo tôi không có tuyến đường gây ra sự cố này.

Vì vậy, để tóm tắt:

  • Tôi có một file index.html trên đĩa và IIS7 được thiết lập để sử dụng index.html như tài liệu mặc định.
  • Nếu tôi xóa ứng dụng ASP.NET MVC của mình và để tệp index.html được phân phát dưới dạng tài liệu mặc định như mong đợi.
  • Nếu tôi xuất bản ứng dụng ASP.NET MVC của mình thì index.html không được phân phối theo tài liệu mặc định.

Có ai biết cách tải ASP.NET MVC để phục vụ tài liệu mặc định không?

+0

có lẽ bạn sẽ nhận được phản hồi tốt hơn trên serverfault.com – tzenes

+0

Đây không phải là vấn đề IIS7, đó là vấn đề ASP.NET MVC. Các tài liệu mặc định được phục vụ hoàn hảo khi không sử dụng ASP.NET MVC –

+0

Tôi thực sự bối rối tại sao điều này sẽ cần phải được thực hiện –

Trả lời

-3

Tôi nghi ngờ bạn đã thêm index.html vì tiện ích mở rộng đó sẽ không được biết đến với khung mvc.

Trang chỉ mục mặc định của bạn trong mvc là // tên miền/home/index và chỉ mục index.aspx.

Nếu bạn gọi tên miền của mình bằng cách sử dụng // domain thì công cụ định tuyến sẽ giả sử /home/index.aspx chứ không phải index.html.

+0

Công cụ định tuyến sẽ không được định tuyến đến hành động chỉ mục trên bộ điều khiển nhà vì như tôi đã nói tôi đã nhận xét tất cả tuyến đường trong global.asax của tôi. Có tệp index.html trên đĩa và IIS7 được đặt để sử dụng index.html làm tài liệu mặc định nhưng ASP.NET MVC đang ngăn chặn điều này bằng cách nào đó –

2

Tôi đã tìm ra cách để giải quyết vấn đề này. Nếu bạn muốn index.html là trong thư mục gốc của ứng dụng MVC của bạn (nghĩa là bên cạnh điều khiển của bạn/mô hình/xem/appdata vv thư mục), bạn có thể làm điều này:

Giả sử bạn có home.html, aboutus.htmlcontactus.html.

//this route matches (http://mydomain.com/somekindofstring) 

routes.MapRoute(
    "SingleRootArg", 
    "{id}", 
    new { controller = "Home", action = "Details", id=""}); 

// so now that you have your route for all those random strings. 
// I had to do this for vanity urls. mydomain.com/ronburgandy etc. however, 
// mydomain.com/index.html will also come in just how you'd expect. 

//Just an example of what you COULD do. the user would see it as root html. 

Public ActionResult Details(string id) 
{ 

    //let me save you the trouble - favicon really comes in as a string *ANGER* 
    if(String.IsNullOrEmpty(id) || id.ToLower().Contains("favicon.ico")) 
     return Redirect("~/index.html"); 
    if(id == "aboutus.html") 
     return Redirect("~/aboutus.html"); 
    if(id == "contactus.html") 
     return Redirect("~/contactus.html"); 
    if(id == "index.html") 
     return Redirect("~/index.html"); 
} 

index.htmlaboutus.htmlindex.html hiện đang ở mức độ tương tự như tập tin csproj tôi.

1

Bạn có thể bỏ qua tuyến đường trong ứng dụng MVC của mình và để IIS phục vụ.

routes.IgnoreRoute("index.html") 
etc 
+3

Thật không may điều này không hoạt động đối với "Tài liệu mặc định" vì người dùng không nhập index.html vào địa chỉ. Nếu bạn truy cập trực tiếp vào index.html, thao tác này sẽ hoạt động. – mkchandler

+0

@ mc2thaH Bạn sẽ cần phải thay đổi thiết lập "tài liệu mặc định" trong IIS từ default.aspx thành index.html. OP cho biết ông đã làm điều này. – tarn

+1

mkchandler là đúng, ngay cả với bộ tài liệu mặc định, nó không hoạt động cho tôi. Thay vào đó, tôi phải thêm routes.IgnoreRoute ("") – pius

2

Tôi gặp sự cố tương tự với ứng dụng WebForms. Trong web.config của bạn, hãy đảm bảo thuộc tính resourceType của trình xử lý StaticFile trong system.webServer được đặt thành Either.

<add name="StaticFile" path="*" verb="*" type="" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" scriptProcessor="" resourceType="Either" ... 
+0

Phương thức 'routes.IgnoreRoute (" ");' không hoạt động đối với tôi. Điều này đã làm. Cảm ơn. –

+0

Tôi đã có thể sử dụng ứng dụng này với Orchard để nhận được Tài liệu mặc định hoạt động. Thêm DefaultDocumentModule và có resourceType = "Hoặc là" là khóa. James

27

Định tuyến ASP.Net MVC được kiểm soát bởi các tệp Global.asax/Global.asax.cs. Định tuyến out-of-the-box trông như thế này:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 
} 

Khi không có đường dẫn nào được chỉ định, nghĩa là. www.domain.tld/, tuyến đường là chuỗi trống, "". Do đó định tuyến sẽ tìm một bộ điều khiển với tên đó. Nói cách khác, nó tìm kiếm một bộ điều khiển không có tên nào cả. Khi không tìm thấy bộ điều khiển nào, nó sẽ phục vụ trang lỗi 404 NOT FOUND.

Để giải quyết vấn đề, hoặc là bản đồ đó đường dẫn đến một cái gì đó có ý nghĩa hoặc khác bỏ qua mà tuyến đường hoàn toàn, đi qua kiểm soát vào file index.html:

routes.IgnoreRoute(""); 
+0

"Do đó định tuyến tìm kiếm một điều khiển với tên đó. Nói cách khác, nó sẽ tìm một bộ điều khiển không có tên nào cả. " - thực sự, nó đang tìm kiếm Trang chủ/Chỉ mục - đó là các tham số mặc định trong cuộc gọi MapRoute –

2

Xin lỗi vì hồi sinh xác ướp này, nhưng tôi don' T tin rằng vấn đề này đã từng là một vấn đề tài liệu mặc định. Trong thực tế, bạn có thể không muốn có một bộ tài liệu mặc định như nhiều người trả lời khác đã nói.

Đã xảy ra sự cố này, một vấn đề tương tự. nguyên nhân của vấn đề của tôi là Hồ bơi ứng dụng cho trang web đã được đặt để sử dụng .NET Framework v2 và phải được đặt thành v4. một khi tôi đã thay đổi nó đã được nạp đúng cách.

Các vấn đề liên quan