0

问题:为什么我的操作 Add 被命中而不是我的 delete 操作?

错误信息:

"ExceptionMessage": "找到与请求匹配的多个操作:添加类型 blog.Controllers.api.UsersController 删除类型 blog.Controllers.api.UsersController

我的角度删除

$scope.delete = function (email) {

        $http.post('/api/users/Delete', email).success(function() {
            initData();
        });           
    }

替代测试

 //$http({
        //        url: '/api/users/Delete',
        //        method: 'POST',
        //        data: { 'userEmail': email }
        //    })
        //    .success(function(data, status, headers, config) {
        //        initData();
        //    }).
        //    error(function(data, status, headers, config) {
        //        $scope.showError = true;
        //    });

我的 MVC 5 api 控制器

    private readonly UserDataAccess _userDataAccess;

    // GET: Users/Add
    [HttpPost]
    public HttpResponseMessage Add(User user)
    {
        _userDataAccess.AddUser(user);

        return Request.CreateResponse(HttpStatusCode.OK);
    }


// GET: Users/Delete - never gets hit
        [HttpPost]
        public HttpResponseMessage Delete([FromBody]string userEmail)
        {
            _userDataAccess.DelereUserByEmail(userEmail);

            return Request.CreateResponse(HttpStatusCode.OK);
        }

请注意,我不想使用路由来解决它。

4

3 回答 3

2

在 WebApi 中,每个路由只能有一个 POST 操作。为了拥有多个控制器类,您需要定义新的路由。

如果您使用的是 WebApi 2,您可以受益于RoutingAttribute并定义这些新的子路由

在您的控制器类中使用RoutePrefixAttributte

[RoutePrefix('api/users')]
public class Users: ApiController{ ...

其次是您的 2 条子路线:

[Route('add')]
[HttpPost]
public HttpResponseMessage Add(User user){..

[Route('delete')]
[HttpPost]
public HttpResponseMessage Delete([FromBody]string userEmail) {

关于路由

Web Api v1在application_start事件的global.asax中全局定义资源。假设您使用的是 Visual Studio 2013 并基于 Microsoft 的默认模板,您的方法可能如下所示:

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

WebApi 路由配置发生在这里WebApiConfig.Register,而您的 MVC 配置发生在这里 RouteConfig.RegisterRoutes

您的 WebApi 路由配置应如下所示

public static class WebApiConfig{
        public static void Register(HttpConfiguration config){            
            config.Routes.MapHttpRoute(
                name: "apiSample",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = System.Web.Http.RouteParameter.Optional  }
            );

     ...

如前所述,WebApi v2 引入了路由属性 ,这些属性可以与您的 Controller 类一起使用,并且可以促进路由配置。

例如:

 public class BookController : ApiController{
     //where author is a letter(a-Z) with a minimum of 5 character and 10 max.      
    [Route("html/{id}/{newAuthor:alpha:length(5,10)}")]
    public Book Get(int id, string newAuthor){
        return new Book() { Title = "SQL Server 2012 id= " + id, Author = "Adrian & " + newAuthor };
    }

   [Route("json/{id}/{newAuthor:alpha:length(5,10)}/{title}")]
   public Book Get(int id, string newAuthor, string title){
       return new Book() { Title = "SQL Server 2012 id= " + id, Author = "Adrian & " + newAuthor };
   }
...

您也可以使用类似的问题参考此其他 POST

如何编写 REST 服务以支持 .net MVC Web API 中的多个 Get Endpoints

于 2014-08-07T22:04:41.107 回答
0

您可以[HttpDelete]在 Api 控制器中的 delete 方法上添加属性,然后$http.delete改为调用它。

[HttpDelete]
public IHttpActionResult Delete(string email) {
    return StatusCode(HttpStatusCode.NoContent);
}

引用HttpDeleteAttribute Class的文档。

表示用于限制操作方法的属性,以便该方法仅处理 HTTP DELETE 请求。

于 2014-08-07T22:44:13.553 回答
0
[HttpPost]
[Route('api/User/Delete/{userEmail}')]
public HttpResponseMessage Delete([FromBody]string userEmail)
{
}

您也可以手动配置路由

于 2014-08-07T22:14:47.377 回答