【发布时间】: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 是获取响应标头的一种方式。