我用 Fiddler 测试了以下内容
POST http://localhost:35979/api/tests HTTP/1.1
User-Agent: Fiddler
Host: localhost:35979
Content-Type: application/json; charset=utf-8
Content-Length: 36
{"FirstName":"Foo","LastName":"Bar"}
使用此控制器。 (你没有提供Minimal, Complete, and Verifiable example,所以我自己制作)
[RoutePrefix("api/student")]
public class StudentController : ApiController {
// POST api/student
[HttpPost]
[Route("")]
public async Task<string> Post() {
var content = await Request.Content.ReadAsStringAsync();
return content;
}
}
在content 上有一个断点,我能够调试发布的原始值是
"{\"FirstName\":\"Foo\",\"LastName\":\"Bar\"}"
在 Visual Studio 中的 Text Visualizer 中看起来像这样
{"FirstName":"Foo","LastName":"Bar"}
回到 Fiddler,我收到以下原始响应(为简洁起见,删除了其他标头)
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 46
"{\"FirstName\":\"Foo\",\"LastName\":\"Bar\"}"
您会注意到发布的内容确实在响应中返回。
但是它作为原始转义字符串返回。如果您转到 Fiddler 中响应的 JSON 选项卡,它将是空的,就像您在标题中显示的那样。但是您会注意到底部有一条消息说明
位置 0 处的文本无效
这在您的标题中不可见。我的猜测是 Fiddler 无法将响应的内容解析为 Json。
现在,如果您希望框架使用发送到控制器的参数,您可以尝试以下方法之一。
创建一个模型/有效负载来存储您的参数,以便您可以使用对象而不是原始值。
public class Student {
public string FirstName {get;set;}
public string LastName {get;set;}
}
编辑您的控制器以期望该模型,或者正如您将在第二个示例操作中看到的那样,它可以从主体或 URI 中提取参数
[RoutePrefix("api/student")]
public class StudentController : ApiController {
// POST api/student
[HttpPost]
[Route("")]
public async Task<Student> Post(Student content) {
var FirstName = content.FirstName;
var LastName = content.LastName;
return content;
}
// POST api/student/bodyexample
[HttpPost]
[Route("bodyexample")]
public async Task<Student> Post2([FromBody]FirstName, [FromBody] LastName) {
var content = new Student { FirstName = FirstName, LastName = LastName };
return content;
}
}
希望对你有帮助