我希望在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)不支持的媒体类型。'
所以在谷歌搜索之后,大多数建议是ContentType没有指定,如果我添加
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 Core 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]
属性,因为它具有可怕的错误处理能力,请参阅Here。
如果请求正文有任何无效输入(语法错误,不支持的输入),那么它会抛出400
和415
以查找错误请求和不支持的内容。出于同样的原因,它可能需要null作为来自请求体的输入,它不理解格式。
因此,删除该属性并尝试以纯格式上传字符串,因为它只接受String,并且您不需要在发出请求时指定Content-Type属性。
[HttpPost]
public void Post(string value)
{
}
这就像你在原帖中所说的一样。
WebClient client = new WebClient();
client.UploadString("https://localhost:44345/api/Test", "ABC");