【问题标题】:ASP.NET Web API 2 Setting Controller RoutesASP.NET Web API 2 设置控制器路由
【发布时间】:2014-11-29 03:27:40
【问题描述】:

我一整天都在摸不着头脑,因为我无法弄清楚我的代码有什么问题。

首先,我有一个这样的控制器:

namespace MyProject.Controllers {
    [RoutePrefix("api/Account")]
    public class AccountController : ApiController {
        [AllowAnonymous]
        [Route("Register")]
        public async Task<IHttpActionResult> Register(AccountModel model) {
            ...
            return Ok();
        }
    }
}

但是,当我添加一个新控制器并引入一个新路由时,就会出现问题。

新的控制器如下:

namespace MyProject.Controllers {
    [RoutePrefix("api/Admin")]
    public class AdminController : ApiController {
        [AllowAnonymous]
        [Route("Encrypt")]
        public IHttpActionResult Encrypt(string clientSecret) {
            ...
            return Ok();
        }
    }
}

然后我通过Postman 发出请求,如下所示:

不幸的是,返回错误:

{
    "message": "No HTTP resource was found that matches the request URI 'http://localhost/api/admin/encrypt'."
}

我正在使用WebApiConfig.cs中定义的默认路由映射配置:

config.MapHttpAttributeRoutes();

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

谁能解释一下?


更新

如果我以这种方式发送POST请求,我可以成功得到Ok()响应。

我现在有一个问题。 为什么只能通过 URL 传递参数,而不能通过表单对象传递?

【问题讨论】:

  • 你为什么要发布而不是获取?
  • 我想加密我的数据并将其存储在数据库中,然后将结果发回给我。 “api/account/register”也是一个有效的 POST 请求。
  • 你可以试试这条路线 [Route("Encrypt/{clientSecret}")] 并检查它是否有效
  • 原来是Parameter Binding 问题。但是,我仍然没有使用 x-www-form 作为我的请求的数据容器。

标签: c# asp.net asp.net-web-api2


【解决方案1】:

要带参数调用,在路由属性中包含参数并添加POST动词如下:

  [Route("Encrypt/{clientSecret}")]
  [HttpPost]
  public IHttpActionResult Encrypt(string clientSecret) {
            ...
            return Ok();
       }

然后调用如下:

 http://localhost/api/admin/encrypt/123456     

但是 post 方法的约定是没有参数的,如下所示:

[Route("Encrypt")]
[HttpPost]
public IHttpActionResult Encrypt() {
            ...
            return Ok();
       }
   }

然后调用如下:

 http://localhost/api/admin/encrypt

如果不想添加 POST 动词,可以在方法前加上 POST 动词,如下所示:

public IHttpActionResult PostEncrypt(string clientSecret)

public IHttpActionResult PostEncrypt()

【讨论】:

    【解决方案2】:

    我建议您对路线定义稍作改动: api/{controller}/{action}/{id}
    imo 的原因是 Web api 操作默认为标准接受动词。 然后你可以无论如何命名你的 api 操作方法,只用相关的 accept 属性装饰它们。

    【讨论】:

    • 那为什么路由api/account/register 有效呢?我从一开始就使用相同的路由定义api/{controller}/{id}
    • 你是不是碰巧通过get调用了register?这是动作默认值
    • 工作请求和非工作请求都是POST
    • 我记得通过 post 动词传递字符串参数时 Web Api 中的这种奇怪行为,直到我在请求正文前加上“=”符号之前它对我不起作用。对于您的实例,您将拥有正文:=123456 请注意,您没有指定参数名称
    • 你试过 = 前缀吗?进展如何。
    猜你喜欢
    • 2015-11-10
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多