You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#中HttpWebRequest传递JSON参数时参数始终为空的问题

解决HttpWebRequest传JSON参数为空的问题

我之前也踩过一模一样的坑!明明请求能触发目标方法,但参数就是接收不到,结合你给出的代码片段,咱们从这几个核心点逐一排查:

1. 必须设置正确的请求头

这是最容易被忽略的关键!HttpWebRequest默认不会携带JSON类型的Content-Type,服务端根本不知道你传的是JSON,自然解析不了参数:

var request = (HttpWebRequest)WebRequest.Create("你的接口URL");
request.Method = "POST";
request.ContentType = "application/json; charset=utf-8"; // 一定要加这个!
request.Accept = "application/json";

2. 确认JSON序列化的正确性

你用的ToJson()自定义方法可能存在问题,建议先把序列化后的字符串打印出来验证格式:

string JsonParameters = amount.ToJson();
Console.WriteLine(JsonParameters); // 确认输出是 {"currencyCode":"EUR","amount":1234} 这种标准JSON格式

如果自定义序列化不靠谱,直接用官方序列化库更稳妥:

// Newtonsoft.Json写法(适用于所有.NET版本)
string JsonParameters = JsonConvert.SerializeObject(amount);
// System.Text.Json写法(.NET Core/.NET 5+推荐)
string JsonParameters = JsonSerializer.Serialize(amount);

3. 正确写入请求流

很多人写流时会忽略编码或流的状态,导致服务端读不到完整内容:

// 更稳妥的字节数组写入方式
byte[] byteData = Encoding.UTF8.GetBytes(JsonParameters);
request.ContentLength = byteData.Length; // 手动设置内容长度避免异常
using (var stream = request.GetRequestStream())
{
    stream.Write(byteData, 0, byteData.Length);
}

如果用StreamWriter,一定要记得Flush确保数据全部写入:

using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
    streamWriter.Write(JsonParameters);
    streamWriter.Flush();
}

4. 验证服务端的接收逻辑

如果你的服务端是ASP.NET系列,要确保接口参数标记正确:

// ASP.NET Core示例,必须加[FromBody]标记
[HttpPost]
public IActionResult YourTargetMethod([FromBody] Amount amount)
{
    // 业务逻辑
}

要是服务端期望接收FormData而非JSON,那传JSON肯定会参数为空,这点也要确认。

完整验证示例

把以上要点整合,写个完整的请求代码测试:

Amount amount = new Amount { currencyCode = "EUR", amount = 1234 };
string json = JsonConvert.SerializeObject(amount);

var request = (HttpWebRequest)WebRequest.Create("https://your-api-url.com/your-endpoint");
request.Method = "POST";
request.ContentType = "application/json; charset=utf-8";

byte[] data = Encoding.UTF8.GetBytes(json);
request.ContentLength = data.Length;

using (var stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
}

using (var response = (HttpWebResponse)request.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
{
    string result = reader.ReadToEnd();
    // 处理返回结果
}

按这个步骤排查,大概率能解决参数为空的问题~

内容的提问来源于stack exchange,提问作者user3454910

火山引擎 最新活动