2013-06-27 49 views
16

Am đã AJAX cuộc gọi đến bộ điều khiển của tôi trong ứng dụng MVC của tôiAJAX Gọi trở lại 404 công trình (địa phương) trong IIS 7,5 nhưng cùng trong IIS khác

Controller/FunctionName 



$.ajax({ 
     type: "GET", 
     contentType: "application/json; charset=utf-8", 
     url: '/Controller/FunctionName', 
     . 
     . 
     . 
     )}; 

Đang sử dụng MVC 4 và tận dụng các JQUERY Ajax chức năng như trong đoạn mã trên. Nó hoạt động hoàn toàn tốt khi tôi chạy từ Visual studio.

Tôi đã xếp loại này vào máy chủ và như mong đợi nó hoạt động tốt. Không tìm thấy sự cố nào trong các cuộc gọi AJAX.

Bây giờ là cố gắng để triển khai này trong máy tính cục bộ của tôi IIS mà là giống như phiên bản máy chủ của tôi (IIS 7.5) nhưng tôi nhận được 404 cho tất cả các cuộc gọi ajax trong firebug.

Tôi đã xác minh bản dựng và thậm chí tôi chỉ vào thư mục web của mình và vẫn đang tìm kiếm những gì đã xảy ra !!

Nó hoạt động trong IIS khác vì vậy nó sẽ không là một vấn đề giải quyết URL là gues của tôi. Tôi có thiếu bất kỳ cài đặt nào hay Bất kỳ ý tưởng kịp thời nào để sửa lỗi này sẽ tuyệt vời.

Cảm ơn

Trả lời

32

Điều đó là bình thường. Bạn đã hardcoded url hành động điều khiển của bạn:

url: '/Controller/FunctionName', 

Nếu bạn triển khai ứng dụng của bạn trong một thư mục ảo trong IIS url đúng nên là:

url: '/YourAppName/Controller/FunctionName', 

Đó là lý do tại sao bạn nên tuyệt đối không bao giờ hardcode các url trong ứng dụng ASP.NET MVC nhưng LUÔN LUÔN sử dụng các trình trợ giúp url để tạo ra nó:

url: '@Url.Action("FunctionName", "Controller")', 

và nếu cuộc gọi AJAX này nằm trong tệp javascript riêng biệt nơi bạn không thể sử dụng trình trợ giúp phía máy chủ, khi đó bạn có thể đọc url này từ một số phần tử DOM mà bạn đang AJAXifying.

Ví dụ chúng ta hãy giả sử rằng bạn đã có một neo:

@Html.ActionLink("click me", "FunctionName", "Controller", null, new { id = "myLink" }) 

mà bạn AJAXify:

$('#myLink').click(function() { 
    $.ajax({ 
     url: this.href, 
     contentType: 'application/json; charset=utf-8', 
     type: 'GET', 
     . 
     . 
     . 
    )};  
    return false; 
}); 

Chú ý cách chúng tôi đang đọc url từ phần tử DOM được tạo ra bởi một helper.

Kết luận và 2 quy tắc của ngón tay cái:

  • NEVER EVER hardcode một url trong một ứng dụng ASP.NET MVC
  • TUYỆT ĐỐI LUÔN giúp việc sử dụng url khi giao dịch với các url trong một ASP.NET Ứng dụng MVC
+1

Hoàn toàn đồng ý với bạn @Darin. Nó hoạt động như thế nào trong một IIS chứ không phải trong IIS khác? – user2067567

+0

@Darin Cùng một câu hỏi. Nếu nó hoạt động trong IIS khác tại sao không phải trong khác? – Peru

+1

Điều đó sẽ phụ thuộc vào cách ứng dụng được cấu hình - cho dù ứng dụng đó được triển khai trực tiếp trong một trang web hay là thư mục ảo. –

0

Những gì tôi tìm thấy trên thiết lập IIS7.5 của tôi là 'Bản đồ xử lý' có tài nguyên có tên 'OPTIONSVerbHandler' không được đặt theo đúng thứ tự hen ce trở lại như Unknown.

Tác phẩm này dành cho tôi, nơi máy chủ cục bộ của tôi đang gọi máy chủ mạng của tôi, có tên khác, không nên cung cấp cho tôi vấn đề CORS, nhưng nó đã làm và đây là giải pháp của tôi.

Mở IIS và nhấp vào tên máy chủ của bạn ở ngăn bên trái. Ở khung bên phải, nhấp đúp vào 'Handler Mappings' ở giữa panel. Trên ngăn bên phải, chọn 'Xem danh sách có thứ tự'. Từ đó tìm thấy 'OPTIONSVerbHandler' và 'svc-ISAPI-4.0_32bit', di chuyển 'OPTIONSVerbHandler' cho đến khi nó ở trên 'svc-ISAPI-4.0_32bit'.

Đảm bảo 'trình xử lý' bên trong cuộc gọi ajax của bạn không có 'Access-Control-Allow-Origin' trong đó.

0

Chỉ cần một sự bổ sung của Darin's answer rằng nếu "cuộc gọi AJAX là trong một tập tin javascript riêng biệt, nơi bạn không thể sử dụng những người giúp đỡ phía máy chủ", sử dụng một lĩnh vực tiềm ẩn để lưu trữ các thiết bị đầu cuối url trong giao diện:

@Html.Hidden("URLEndpointName", Url.Action("FunctionName", "Controller")) 

và đọc trường ẩn đó trong js của bạn:

url: $("#URLEndpointName").val(),