Tor*_*rfi 14 c# model-binding asp.net-core
我只是没有运气将 url 编码的表单值从邮递员发送到使用文件-> 新项目创建的 vanilla asp.net core 2.1 web api。我什么也没做,但新的模型验证功能似乎仍然启动并向邮递员返回 400 Bad Request。谁能告诉我我做错了什么?
控制器动作:
// POST api/values
[HttpPost]
public void Post([FromBody] string value)
{
}
Run Code Online (Sandbox Code Playgroud)
原始请求(如 fiddler 所示):
POST http://localhost:60843/api/values HTTP/1.1
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: a791eee7-63ff-4106-926f-2s67a8dcf37f
User-Agent: PostmanRuntime/7.3.0
Accept: */*
Host: localhost:60843
accept-encoding: gzip, deflate
content-length: 7
Connection: keep-alive
value=test
Run Code Online (Sandbox Code Playgroud)
原始回复:
HTTP/1.1 400 Bad Request
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Server: Kestrel
X-SourceFiles: =?UTF-8?BQzpcUmVwb3NcVGVzdGJlZFxNb2RlbEJpbmRpbmdcTW9kZWxCaW5kaW5nXGFwaVx2YWx1ZXM=?=
X-Powered-By: ASP.NET
Date: Thu, 25 Oct 2018 15:23:49 GMT
21
{"":["The input was not valid."]}
0
Run Code Online (Sandbox Code Playgroud)
再次注意,这是 Visual Studio 2017 中 asp.net web api 的默认模板。
一个有趣的事实是,如果我添加 Swashbuckle 并转到 swagger ui 端点并使用内置的“尝试”功能,它也会立即产生错误。
我已经让它与复杂类型和 json 主体一起工作,但我无法让简单类型工作,我已经尝试过各种不同的内容类型。
Tor*_*rfi 24
对于那些偶然发现这个问题的人,从 2.1 版开始,默认情况下会应用自动模型绑定,如果模型绑定失败,则返回 400 Bad Request(从早期版本更改,要求您检查 ModelState.IsValid 以查看模型绑定是否成功)。
将简单类型发布到 asp.net 核心控制器操作时,您现在必须指定它的来源。可以推断复杂类型,但不能推断像 int 和 string 这样的简单类型(如果它们位于消息正文中。如果它们位于查询字符串或路由(url)中,则推断它们)。我看到在正文中传递值的两个选项是:
邮递员请求:
POST http://your-url/api/values HTTP/1.1
Content-Type: application/x-www-form-urlencoded
value=test
Run Code Online (Sandbox Code Playgroud)
动作方法签名:
[HttpPost]
public void Post([FromForm]string value)
{
}
Run Code Online (Sandbox Code Playgroud)
来自邮递员的请求:
POST http://your-url/api/values HTTP/1.1
Content-Type: application/json
"test"
Run Code Online (Sandbox Code Playgroud)
动作方法签名:
[HttpPost]
public void Post([FromBody]string value)
{
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12442 次 |
| 最近记录: |