我创建了我的第一个ASP.Net Web API,它接收发布的凭据并返回ClaimsPrincipal:
Credentials.vb
Public Class Credentials
Public Property UserName as String
Public Property Password as String
End Class
MyController.vb
<Route("v1/login")>
<OverrideAuthorization>
<HttpPost>
Public Function Login(c as Credentials) As IHttpActionResult
Dim cp As ClaimsPrincipal = DataBaseLogin.GetDataBasePrincipal(c.UserName, c.Password)
' removed for brevity ...
Return Ok(cp)
End Function
在Fiddler中,我正在尝试为此方法构建POST
:
POST http://localhost:58442/v1/login HTTP/1.1
Host: localhost:58442
Content-type: application/x-www-form-urlencoded
Content-Length: 35
{"Username":"foo","Password":"bar"}
方法被命中(断点触发中断),变量c
被输入为Credential
,但方法中c.UserName
和c.Password
的值均为{{1} }}
更新
解决了它。 Nothing
必须为Content-type
而非application/json
答案 0 :(得分:2)
基本上,由于简单类型(字符串参数),Web API期望从URI中获取这些参数,因此您获得404。
更改动作方法有点像这样(抱歉C#)。
public class MyController : ApiController
{
[Route("v1/login")]
[HttpPost]
public IHttpActionResult Login(Cred c)
{
return Ok();
}
}
public class Cred
{
public string UserName { get; set; }
public string Password { get; set; }
}
此外,请在请求中添加Content-type: application/x-www-form-urlencoded
。这应该工作。顺便说一下,你可以对字符串参数使用[FromBody]
但是你不能使用两个,因为body只能使用一次。如果您有一个参数,则可以使用该参数而不是复杂类型(类)。