【问题标题】:Doing a post request in C# results in strange output在 C# 中执行发布请求会导致奇怪的输出
【发布时间】:2017-02-17 12:58:45
【问题描述】:

我正在向几台服务器发出发布请求。这些服务器返回除一个以外的所有 json。其中一个返回如下数据:1fe2 80b9 0800 0000 0000 0400 c3ac c2bd。

如果我对休息客户端执行相同操作,我会从所有服务器获得有效的 Json,但是当我在 c# 中执行此操作时,其中一个服务器会返回那种数据。

我使用以下代码来做到这一点:

public static string MakeRequest(string url, string requestBody, string methodName)
        {
            string result = "";
            using (var client = new WebClient())
            {
                client.Headers[HttpRequestHeader.ContentType] = "application/json"; 
                result = client.UploadString(string.Format("{0}{1}", url, methodName), "POST", requestBody);
            }
            return result;
        }

我也试过这个(旧代码):

public static string MakeRequestA(string url, string requestBody, string methodName)
        {
            byte[] postBytes        = Encoding.ASCII.GetBytes(requestBody);

            var request     = (HttpWebRequest)WebRequest.Create(string.Format("{0}{1}", url, methodName));
            request.KeepAlive       = false;
            request.ProtocolVersion = HttpVersion.Version11;
            request.Method          = "POST";
            request.ContentType     = "application/json";
            request.Accept          = "text/plain";
            request.ContentLength   = postBytes.Length;

            Stream requestStream = request.GetRequestStream();

            requestStream.Write(postBytes, 0, postBytes.Length);
            requestStream.Close();

            WebResponse response = request.GetResponse();  
            Console.WriteLine (((HttpWebResponse)response).StatusDescription);  

            var dataStream = response.GetResponseStream ();
            var reader = new StreamReader (dataStream);  
            string responseFromServer = reader.ReadToEnd ();  

            reader.Close ();  
            dataStream.Close ();  
            response.Close ();  
            return responseFromServer;
        }

我不能真正给你服务器网址,因为它们是私人的。有人知道为什么我要获取此数据而不是有效的 json 吗?

【问题讨论】:

  • 您可能需要将用户代理和主机添加到请求的标头中。最近我使用了一个 Web 服务,如果没有适当的用户代理,它就无法处理请求。
  • 获取Fiddler profiler 并查看两种情况下发送到服务器的内容,您将能够看到差异。
  • 确实,您可能需要添加更多标题,尽管我不确定是哪个。列表见这里:soapui.org/testing-dojo/best-practices/…
  • 您也可以尝试使用HttpClient。检查这个Comparison Article
  • 它可能是一个 GZIP 文件。当客户端和服务器建立 HTTP 连接时,会使用标头进行协商。似乎在服务器上使用了一种不同的模式,该模式在其他模式下不起作用。协商模式位于响应的标头中。因此,我会将良好响应中的标头与不良响应中的标头进行比较。使用 fiddler 是获取响应标头的一种方式。

标签: c# json rest webclient


【解决方案1】:

您好,请在您的机器上安装提琴手工具,然后检查 REST 客户端生成的请求标头。并捕获由.net客户端生成的请求头。然后比较两种请求格式来找到解决方案

【讨论】:

  • 请在评论部分执行此操作。这不能被视为一个答案。
猜你喜欢
  • 1970-01-01
  • 2021-05-26
  • 2019-01-12
  • 1970-01-01
  • 2012-05-11
  • 2017-05-15
  • 2021-09-25
  • 2018-03-24
  • 1970-01-01
相关资源
最近更新 更多