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
相关产品推荐
相关产品推荐

