第二个API上的ASP.Net Web API 404错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第二个API上的ASP.Net Web API 404错误相关的知识,希望对你有一定的参考价值。

所以我已经设置了1个Web API并且运行良好,但是现在我正在尝试建立自己的管理面板(我做了),我需要使用名为DeleteUser()的Web API中的AdminApi函数,但我不能似乎让它运作起来。在给出API应该处于的路径时,我一直收到404错误。

Web Api配置:

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}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

全球:

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

    //Create the custom role and user
    RoleActions roleActions = new RoleActions();
    roleActions.AddUserAndRole();
}

AdminApi:

[Authorize(Roles = "admin")]
public class AdminApiController : ApiController
{
    public string test()
    {
        return "test";
    }

    [HttpPost]
    public string DeleteUser(string id)
    {
        ApplicationDbContext db = new ApplicationDbContext();
        var user = db.Users.Find(id);
        if (user != null)
        {
            string email = user.Email;
            db.Users.Remove(user);
            return "Succesfully deleted user : " + email;
        }
        else
            return "Failed to delete user.";
    }
}

阿贾克斯:

function deleteUser (id)
{
    $.ajax({
        url: '../api/AdminApi/DeleteUser',
        type: 'POST',
        contentType: "application/json",
        dataType: 'json',
        data: JSON.stringify(id),
        success: function (data) {
            alert(data);
        },
        error: function (x, y, z) {
            alert(x + '
' + y + '
' + z);
        }
    });
}

在页面/ Admin / AdminPage上调用ajax函数,以便访问web api - > ../api/AdminApi,删除用户的功能是DeleteUser - > ../api/AdminApi/DeleterUser

我不明白为什么我会收到404错误。我能理解我的函数DeleteUser是否无法工作,因为我没有测试它,但如果我无法进入函数,我就无法测试它。

答案

该问题与您使用该属性的方式有关:

[Route("DeleteUser")]

如果使用属性路由。在方法级别,它所做的是定义新路由或更多路由,因此您应该使用它的方式就像[Route('Url/path1/route1')]

作为它如何工作的一个例子:

//GET api/customer/GetMetaData
[Route('/api/customer/GetMetaData')]
public string Get2(){
      //your code goes here
}

如果你要在你的班级中声明几个路线,那么你可以在班级使用像[RoutePrefix('url')]这样的RoutePrefix属性。这将为您在Controller类中的所有方法设置新的基本URL。

例如:

[RoutePrefix("api2/some")]
public class SomeController : ApiController
{
    // GET api2/some
    [Route("")]
    public IEnumerable<Some> Get() { ... }

    // POST api2/some/DeleteUser/5 
    [HttpPost]
    [Route("DeleteUser/{id:int}")]
    public Some DeleteUser(int id) { ... } 

}

更新

默认情况下,Web API首先查看路由URL,我的[Route]中的内容是什么,它会尝试将其与您的帖子进行匹配。但是,如果您的方法具有复杂对象作为参数,则WebApi无法从请求URI获取值,因为参数是复杂类型Web API使用媒体类型格式化程序从请求正文中读取值。

由于你的string id不是一个复杂的对象,它是你的Route的一部分WebApi期望它作为你的URL的一部分而不是身体。试试这个:

[HttpPost]
public string DeleteUser([FromBody]string anotherName)

以上是关于第二个API上的ASP.Net Web API 404错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 HTTP 连接通过托管在 IIS 上的 ASP.NET 成员身份保护 ASP.NET Web API [重复]

C# EF6 使用 Unity 对一个上下文进行多次异步调用 - Asp.Net Web Api

Asp.Net Web API 2第五课——Web API路由

将托管在 AWS EC2 上的 Asp.net Web api 连接到 AWS API Gateway

Asp.Net Web API 2第六课——Web API路由和动作选择

Asp.Net Web API 2第三课——.NET客户端调用Web API