【问题标题】:WebAPI - Attribute Routing POST not working with WebAPI Cors?WebAPI - 属性路由 POST 不适用于 WebAPI Cors?
【发布时间】:2013-08-04 21:48:24
【问题描述】:

我有以下控制器,它应该接受用户名和密码作为 POST 中的有效负载。如果我把它改成 HttpGet 就可以了。

[RoutePrefix("api")]
public class AccountController : ApiController
{
    [HttpPost("login/{username}/{password}")]
    [AcceptVerbs("POST")]
    public Login Login(string username, string password)
    {
        Login login = new Login();
        if (username == "user" && password == "pw") login.Success = true;
        else login.Success = false;
        return login;
    }
}

OPTIONS 请求可以通过,但是 POST 失败。

选项标题:

选项响应:

POST 标头:

POST 响应:

知道我做错了什么吗?

【问题讨论】:

    标签: post asp.net-web-api cors


    【解决方案1】:

    您已经使用[HttpPost("login/{username}/{password}")] 定义了您的路线,但您没有在 url 中而是在请求正文中发送用户名和密码,因此您的路线不匹配,因此您得到 404。

    所以你需要把路由改成[HttpPost("login")]

    它本身是行不通的,因为使用 Web.API 你不能有来自请求正文的多个动作参数,所以你需要一个复杂的类型:

    public class LoginInfo {
        public string username { get; set; }
        public string password { get; set; }
    }
    

    所以对于固定动作应该是这样的:

    [HttpPost("login")]
    [AcceptVerbs("POST")]
    public Login Login(LoginInfo loginInfo)
    {
        Login login = new Login();
    
        if (loginInfo.username == "user" && loginInfo.password == "pw") {
            login.Success = true;
        } else {
            login.Success = false;
        }
    
        return login;
    }
    

    【讨论】:

    • 我马上试试。但正如您在场景 5 中看到的那样 [HttpPost("my/action1/{param1}/{param2")] 应该可以工作:aspnetwebstack.codeplex.com/…
    • 是的,这应该可以工作,因为在这种情况下,param1 和 param2 都来自 URL,而不是像您的情况那样来自请求正文。
    • 那你为什么要使用HttpPost呢?对我来说毫无意义。
    • 因为动作仍然可以做一些改变状态的事情,所以在语义上将动词作为 POST 是有意义的。但是除了 URL 中给出的参数之外,该操作不需要更多参数。
    • 顺便说一句,可以将单个参数传递给 POST 方法,而无需创建复杂类型。您只需要向此参数添加一个 [FromBody] 属性。正如此处所述asp.net/web-api/overview/formats-and-model-binding/… 这不适用于两个参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2016-12-17
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    相关资源
    最近更新 更多