Tôi có một ứng dụng MVC với một vài trang đơn giản sẽ chủ yếu chạy trên các cuộc gọi API Web. Để đơn giản, tôi muốn đưa chúng vào cùng một dự án. Tôi có thể khởi chạy và điều hướng đến trang của mình tốt, nhưng khi tôi cố gắng gọi API của mình thông qua Ajax, tôi vẫn nhận được lỗi 404 - không thể tìm thấy hàm API.Không thể gọi Trình điều khiển WebAPI thông qua AJAX, khi được lưu trữ với MVC
Đây là tập tin javascript của tôi:
$(document).ready(function() {
//set the login button to call our test API function
document.getElementById("login_submit").addEventListener("click", GetUser);
});
function GetUser() {
var response = $.ajax({
url: '/api/User',
method: 'GET',
contentType: 'application/json; charset=utf-8',
success: function (data) {
alert("Success!");
},
error: function (request, status, error) {
alert(error);
}
});
}
Và đây là bộ điều khiển của tôi:
namespace MyProject.Controllers.API
{
public class UserController : ApiController
{
// GET api/<controller>
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/<controller>/5
[HttpGet]
public string Get(int id)
{
return "value";
}
}
}
API điều khiển trong thư mục riêng của họ (gọi là "API") bên trong thư mục Controller của tôi trong tôi dự án - đó là lý do tại sao không gian tên chứa "API" trên bộ điều khiển mẫu này.
Khi tôi sử dụng F12 trên trình duyệt để nắm bắt những yêu cầu nhận được gửi đi, tôi có thể thấy rằng cuộc gọi của tôi có thông tin sau:
Request URL: http://localhost:50035/api/User
Request Method: GET
Status Code: 404/Not Found
Bây giờ tôi hiểu là điều này nên tìm API với tên UserController và tìm hàm bằng thẻ [HttpGet] không có đối số, sau đó trả về mảng chuỗi ("value1", "value2"). Thay vào đó nó không tìm thấy gì cả.
Là một lưu ý cuối cùng, đây là cấu hình định tuyến của tôi (và có, nó đã được khởi tạo trên Global.asax):
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
UPDATE:
Dựa trên những phản hồi Tôi đã nhận được cho đến nay, tôi đã di chuyển cấu hình Global.asax của mình. Nó tại trông như thế này:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Bây giờ khi tôi gọi hàm API của tôi, tôi nhận được ... chờ. Nó không trả về một thông điệp thành công. Nó chỉ bị treo. Tôi không nhận được "Thành công!" cảnh báo.
Đơn đặt hàng bạn đăng ký tuyến đường trong phương thức Global.asax Application_Start() là gì? NẾU bạn đang đăng ký các tuyến MVC trước khi WebAPI roues, thì các tuyến api sẽ thất bại! –
Đã sao chép sự cố bằng cách đăng ký tuyến đường MVC _before_ Tuyến đường WebApi. –
Nếu bạn đặt điểm ngắt trong phương thức Get() của bộ điều khiển Người dùng, nó có bị trúng không? –