C# WebClient 使用 UploadString 从 ApiController 调用 HttpPost 方法,



我想在 C# 中也用 C# 调用 ApiController,但在从 WebClient 实例使用 UploadString 方法上传 Json 时出现错误 415 或 400。

服务器代码是自动生成的调用 TestController。该文件正是Visual Studio 2019生成它的方式。

[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
// GET: api/Test
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// POST: api/Test
[HttpPost]
public void Post([FromBody] string value)
{
}
...
}

客户端代码如下所示:

WebClient client = new WebClient();
client.UploadString("https://localhost:44345/api/Test", "ABC");   // Edit: "ABC" is not a valid JSON

我得到了System.Net.WebException:"远程服务器返回错误:(415) 不支持的媒体类型。

所以在谷歌搜索之后,大多数建议是内容类型没有得到指定,如果我添加

client.Headers[HttpRequestHeader.ContentType] = "application/json";

我收到System.Net.WebException:"远程服务器返回错误:(400) 错误请求。

有什么线索吗?

似乎问题与POST/PUT/PATCH有关...如果我执行GET,它正在工作并将示例数据返回给我["value1","value2"]

编辑:我不坚持使用WebClient.UploadString方法,但我想要一个不涉及25行自定义代码的解决方案...我的意思是我不敢相信你可以用一行在jQuery中做到这一点是那么难。

我得到System.Net.WebException:"远程服务器返回错误:(415) 不支持的媒体类型。

使用[FromBody]时,Content-Type标头用于确定如何解析请求正文。如果未指定Content-Type,则模型绑定过程不知道如何使用正文,因此返回 415。

我收到System.Net.WebException:"远程服务器返回错误:(400) 错误请求。

通过将Content-Type标头设置为application/json,可以指示模型绑定过程将数据视为 JSON,但ABC本身不是有效的 JSON。如果只想发送 JSON 编码的字符串,也可以将值括在引号中,如下所示:

client.UploadString("https://localhost:44345/api/Test", ""ABC"");

"ABC"是有效的 JSON 字符串,ASP.NET 核心 API 将接受该字符串。

简单的解决方案:

在调用 API 时在标头中指定Content-type

WebClient client = new WebClient();
client.Headers.Add("Content-Type", "text/json");
client.UploadString("https://localhost:44345/api/Test", ""ABC"");

编辑:

不要使用[From_Body]属性,因为它具有可怕的错误处理能力, 看这里。

如果请求正文有任何无效的输入(语法错误,不支持的输入),那么它将抛出400415错误的请求和不支持的内容。 出于同样的原因,它可能将 null 作为请求正文的输入,它不理解格式。

因此,请删除该属性并尝试以纯格式上传字符串,因为它仅接受字符串,并且您不需要在发出请求时指定 Content-Type 属性。

[HttpPost]
public void Post(string value)
{
}

并像您在原始帖子中调用的那样称呼它。

WebClient client = new WebClient();
client.UploadString("https://localhost:44345/api/Test", "ABC");

相关内容

  • 没有找到相关文章

最新更新