来自Ajax的MVCWebAPI调用以404响应
我知道这已经被问了几十次了,但我真的很沮丧,因为我能找到的任何建议都不适合我,我真的被卡住了 我的问题是,我无法从ajax调用Web Api,无论是什么配置/组合/任何路由,无论我尝试了什么,它们都不起作用,我只得到了404 这是我的Global.asax文件:来自Ajax的MVCWebAPI调用以404响应,ajax,asp.net-web-api,http-status-code-404,Ajax,Asp.net Web Api,Http Status Code 404,我知道这已经被问了几十次了,但我真的很沮丧,因为我能找到的任何建议都不适合我,我真的被卡住了 我的问题是,我无法从ajax调用Web Api,无论是什么配置/组合/任何路由,无论我尝试了什么,它们都不起作用,我只得到了404 这是我的Global.asax文件: protected void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlo
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
GlobalConfiguration.Configure(WebApiConfig.Register);
}
这是我的WebApiConfig.cs in App_Start文件夹:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
这是我的UserController类:
public class UserController : ApiController
{
public IHttpActionResult GetUserDataById(string id)
{
Clients jsonData = Http.downloadJsonData<Clients>(InsuranceGlobal.clientsUrl);
Client user = jsonData.clients.Where(u => u.id == id).FirstOrDefault();
return Ok(user);
}
}
公共类用户控制器:ApiController
{
公共IHttpActionResult GetUserDataById(字符串id)
{
客户端jsonData=Http.downloadJsonData(InsuranceGlobal.clientsUrl);
Client user=jsonData.clients.Where(u=>u.id==id.FirstOrDefault();
返回Ok(用户);
}
}
这是我在cshtml javascript部分中的Ajax调用:
$("#btnGetUserById").click(function () {
$('#userByName').empty();
$("#gettingByIdMsg").text(" Getting User...");
$.ajax({
url: '../api/User',
type: "GET",
contentType: "application/json",
dataType: "json",
data: { id: $("#userId").val() },
success: function (data) {
$('<tr>', { html: formatItem(data) }).appendTo($('#userByName'));
$("#usersTable").removeClass("hidden");
$("#gettingByIdMsg").text("");
},
fail: function (jqXHR, textStatus) {
$("#gettingByIdMsg").text("Request failed: " + textStatus);
}
});
});
$(“#btnGetUserById”)。单击(函数(){
$('#userByName').empty();
$(“#gettingByIdMsg”).text(“Getting User…”);
$.ajax({
url:“../api/User”,
键入:“获取”,
contentType:“应用程序/json”,
数据类型:“json”,
数据:{id:$(“#userId”).val()},
成功:功能(数据){
$('',{html:formatItem(data)}).appendTo($('#userByName'));
$(“#usersTable”).removeClass(“隐藏”);
$(“#gettingByIdMsg”).text(“”);
},
失败:函数(jqXHR,textStatus){
$(“#gettingByIdMsg”).text(“请求失败:+textStatus”);
}
});
});
我尝试了使用[HttpPost]装饰程序来获取和发布,但没有结果
我想我已经安装了所有必要的Web Api NuGet软件包,应用程序编译时没有错误,但是没有调用Web Api
请帮忙
编辑1:
我必须指出,我并没有在Visual Studio中使用WebApi模板启动一个新项目,而是启动了一个MVC项目,然后安装了所有NuGet WebApi必需的软件包和配置(可能我遗漏了什么,我不知道)。更改
编辑:基于评论
[RoutePrefix("api/User")]
public class UserController : ApiController
{
[Route("getbyid/{id}")]
public IHttpActionResult GetUserDataById(string id)
{
Clients jsonData = Http.downloadJsonData<Clients> InsuranceGlobal.clientsUrl);
Client user = jsonData.clients.Where(u => u.id ==
id).FirstOrDefault();
return Ok(user);
}
}
[RoutePrefix(“api/用户”)]
公共类用户控制器:ApiController
{
[路由(“getbyid/{id}”)]
公共IHttpActionResult GetUserDataById(字符串id)
{
客户端jsonData=Http.downloadJsonData InsuranceGlobal.clientsUrl);
Client user=jsonData.clients.Where(u=>u.id==
id).FirstOrDefault();
返回Ok(用户);
}
}
和客户
$("#btnGetUserById").click(function () {
$('#userByName').empty();
$("#gettingByIdMsg").text(" Getting User...");
$.ajax({
url: '/api/User/getbyid/' + id: $("#userId").val(),
type: "GET",
success: function (data) {
$('<tr>', { html: formatItem(data) }).appendTo($('#userByName'));
$("#usersTable").removeClass("hidden");
$("#gettingByIdMsg").text("");
},
fail: function (jqXHR, textStatus) {
$("#gettingByIdMsg").text("Request failed: " + textStatus);
}
});
});
$(“#btnGetUserById”)。单击(函数(){
$('#userByName').empty();
$(“#gettingByIdMsg”).text(“Getting User…”);
$.ajax({
url:'/api/User/getbyid/'+id:$(“#userId”).val(),
键入:“获取”,
成功:功能(数据){
$('',{html:formatItem(data)}).appendTo($('#userByName'));
$(“#usersTable”).removeClass(“隐藏”);
$(“#gettingByIdMsg”).text(“”);
},
失败:函数(jqXHR,textStatus){
$(“#gettingByIdMsg”).text(“请求失败:+textStatus”);
}
});
});
好的,解决我的问题后,我会回答我自己的问题
首先,我要感谢所有的回复。我爱这个社区,这里的人很好
潜入深海后。。。我记得我以前安装过WebApi.Owin包,为了尝试,我决定卸载它,只留下AspNet.WebApi和voilá,现在WebApi调用可以工作了
我希望所有这些努力都能帮助将来遇到类似问题的其他人。api未定义,因此您将无法找到404。。将api方法名称更改为
Get(string id)
或使用[Route(“getbyId”)装饰您的api
并将您的客户机更改为使用/api/user/getbyId
,就像您使用MapAttributeRoutes
一样。我几乎尝试了所有的可能性。但是我发现这个代码没有任何问题。可能是您可以清理并重新构建解决方案。在我身上发生过很多次,使用相同的路径,我先得到404,您以前错过了一个“/”Id参数在客户端你错过了。但是你需要弄清楚为什么发布的代码不起作用。谢谢你的回复。我按照建议修改了方法的头:[Route(“getbyid/{id}”)],并根据建议更改了url,但结果相同,什么也没发生。如果我在firefox中查看网络选项卡,我会看到url为404。我忘了在控制器级别添加RoutePrefix
。请查看我的编辑。我的结论是,在创建解决方案之后,我添加了所有必要的WebApi NuGet包,而不是模板,可能我遗漏了一些东西。我有WebApi.Owin和AspNet.WebApi以及必需的依赖项,但可能缺少一些东西。我搞不懂。