C# WebClient 使用 UploadString 从同样在 C# 中的

我希望在 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 中使用一条线。


墨色风雨
浏览 226回答 2
2回答

郎朗坤

我收到&nbsp;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",&nbsp;"\"ABC\"");"ABC"是一个有效的 JSON 字符串,将被您的 ASP.NET Core API 接受。

慕码人8056858

简单的解决方案:Content-type调用 API 时在标头中指定,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WebClient client = new WebClient();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.Headers.Add("Content-Type", "text/json");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.UploadString("https://localhost:44345/api/Test", "\"ABC\"");编辑:不要使用[From_Body]属性,因为它具有糟糕的错误处理能力,请参见此处。如果请求正文有任何无效输入(语法错误、不受支持的输入),那么它将抛出错误请求和不受支持的内容400。415出于同样的原因,如果它不理解格式,它可能会将 null 作为来自请求正文的输入。因此,删除该属性并尝试以纯格式上传字符串,因为它只接受 String 并且您在发出请求时不需要指定 Content-Type 属性。[HttpPost]&nbsp;public void Post(string value)&nbsp;{&nbsp;}并像您在原始帖子中的称呼一样称呼它。WebClient client = new WebClient();client.UploadString("https://localhost:44345/api/Test", "ABC");
打开App,查看更多内容
随时随地看视频慕课网APP