为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
墨色风雨 2022-12-31 12:49:24
我希望在 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 中使用一条线。
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

我收到 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 接受。


查看完整回答
反对 回复 2022-12-31
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

简单的解决方案:


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


            WebClient client = new WebClient();

            client.Headers.Add("Content-Type", "text/json");

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

编辑:


不要使用[From_Body]属性,因为它具有糟糕的错误处理能力,请参见此处。


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


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


[HttpPost]

 public void Post(string value)

 {


 }

并像您在原始帖子中的称呼一样称呼它。


WebClient client = new WebClient();

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


查看完整回答
反对 回复 2022-12-31
  • 2 回答
  • 0 关注
  • 225 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信