来自 Ajax 的 MVC Web Api 调用以 404 响应

MVC Web Api call from Ajax responds with 404

我知道这个问题已经被问过很多次了,但我真的很沮丧,因为 none 我能找到的建议对我有用,我真的被困住了。

我的问题是我无法从 ajax 调用网络 Api,无论 configurations/combinations/whatever 的路线和我尝试的一切,none他们中的一些有效,我只得到 404。

这是我的 Global.asax 文件:

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }

这是我在 App_Start 文件夹中的 WebApiConfig.cs:

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 }
        );
    }

这是我的用户控制器class:

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);
    }
}

这是我在 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);
            }
        });
    });

我尝试使用 [HttpPost] 装饰器进行 GET 和 POST 都没有用。

我想我已经安装了所有必要的 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);
    }
}

和客户

$("#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);
            }
        });
    });

好的,解决我的问题后我会回答我自己的问题。

首先我要感谢大家的回复。喜欢这个社区,这里的人都很好。

潜入深海后...我的解决方案配置出错并与之斗争了很多我记得我以前安装过 WebApi.Owin 软件包并且只是为了尝试我决定卸载它只留下 AspNet.WebApi 瞧,现在 WebApi 调用正常了。

我希望所有这些努力对以后遇到类似问题的其他人有所帮助。