所以我已经设置了1个Web API并且运行良好,但是现在我正在尝试设置自己的管理面板(我做过),我需要使用Web API中的DeleteUser()
函数名为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.";
}
}
Ajax:
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 + '\n' + y + '\n' + z);
}
});
}
在页面/ Admin / AdminPage上调用ajax函数 所以去网络api - > ../api/AdminApi 删除用户的功能是DeleteUser - > ../ API / AdminApi / DeleterUser
我不知道为什么会收到404错误。我可以理解我的功能DeleteUser
是否无效,因为我还没有对其进行测试,但如果我无法进入该功能,我就无法对其进行测试。
答案 0 :(得分:1)
问题与您使用属性的方式有关:
[Route("DeleteUser")]
如果您使用属性路线。在方法层面,它的作用是定义新路线或更多路线,因此你应该使用它的方式就像[Route('Url/path1/route1')]
:
作为其工作原理的一个例子:
//GET api/customer/GetMetaData
[Route('/api/customer/GetMetaData')]
public string Get2(){
//your code goes here
}
如果您要在班级中声明多个路线,则可以在班级使用 RoutePrefix 属性,例如[RoutePrefix('url')]
。这将为您在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的一部分,因此希望它作为您网址的一部分而不是正文。试试这个:
[HttpPost]
public string DeleteUser([FromBody]string anotherName)