繁体   English   中英

C#WebClient使用UploadString从C#中的ApiController调用HttpPost方法。 415或400错误

[英]C# WebClient using UploadString to call HttpPost method from an ApiController also in C#. 415 or 400 error

我希望在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]属性,因为它具有可怕的错误处理功能,请参阅此处

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

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

[HttpPost]
 public void Post(string value)
 {

 }

这就像你在原帖中所说的一样。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM