You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# HttpWebResponse返回结果与Postman不一致问题排查解决

C#调用Web API仅返回"OK"无法获取预期JSON响应问题

问题背景

  • 调用公司内部系统Web API接口,接口接收JSON格式请求负载,返回JSON格式响应数据
  • Postman调用验证正常:返回状态码200,响应体为预期JSON数据,确认服务本身运行无异常
  • C#代码调用异常:所有C#实现的请求返回的响应内容都只有"OK"字符串,拿不到预期JSON数据

最初基于HttpWebRequest写的请求代码:

public HttpWebResponse SendRequest(string url, string checkOutFolder, string drawingNo, string login, string password)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.ContentType = "application/json";
    request.Method = "GET";
    request.Accept = "application/json";

    string payload = GeneratePayLoad(checkOutFolder, drawingNo);
    string header = CreateAuthorization(login, password);

    request.Headers[HttpRequestHeader.Authorization] = header;
    request.ServicePoint.Expect100Continue = false;

    // 反射修改内部字段,强行给GET请求写入请求体(非标准实现)
    var type = request.GetType();
    var currentMethod = type.GetProperty("CurrentMethod", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(request);

    var methodType = currentMethod.GetType();
    methodType.GetField("ContentBodyNotAllowed", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(currentMethod, false);

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

    // 读取响应
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    using (StreamReader rd = new StreamReader(response.GetResponseStream()))
    {
        string responseContent = rd.ReadToEnd();
        Console.WriteLine(responseContent);
    }
    return response;
}

排查过程

按常规优化建议依次调整,均未解决问题:

  • 把请求方法从GET改成POST,返回结果没有变化
  • 用Postman自带的代码生成功能导出RestSharp版本的请求代码运行,结果还是只返回"OK",代码如下:
public void Request(string url, string checkOutFolder, string drawingNo, string login, string password)
{
    var client = new RestClient(url);
    var request = new RestRequest();
    request.Method = Method.Post;
    request.AddHeader("Content-Type", "application/json");
    request.AddHeader("Authorization", "Basic **********");
    var body = GeneratePayLoad(checkOutFolder, drawingNo);
    request.AddParameter("application/json", body, ParameterType.RequestBody);
    var response = client.Execute(request);
    Console.WriteLine(response.Content);
}
  • 改用原生HttpClient重写请求逻辑,结果依旧,代码如下:
using (var client = new HttpClient())
{
    string uri = "******************";
    string path = "destinationpath";
    var endpoint = new Uri(uri);
    string payload = GeneratePayLoad(path, "100-0000947591");
    var stringContent = new StringContent(payload);
    var payload2 = new StringContent(payload, Encoding.UTF8, "application/json");
    var byteArray = Encoding.ASCII.GetBytes("*******");
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
    var base64EncodedAuthenticationString = Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(client.DefaultRequestHeaders.Authorization.ToString()));
    var result = client.PostAsync(endpoint, stringContent).Result.Content.ReadAsStringAsync().Result;
    Console.WriteLine("test");
}
  • 写Python脚本用requests库调用同个接口,返回结果和Postman完全一致,确认问题出在C#代码层面,和服务端、网络无关。

最终结论

故障根源:C#代码中GeneratePayLoad方法的生成逻辑存在错误,产出的请求JSON不符合接口要求,导致服务端没有返回预期业务数据,只返回了默认的"OK"响应。

排障提示:遇到不同客户端请求同接口结果不一致的问题,优先抓包对比请求头、请求体的实际内容,不要默认自己封装的公共工具方法(比如本例的payload生成方法)输出一定正确,这类公共方法的逻辑错误往往会被忽略,浪费大量排障时间。


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:09:24