C# HttpWebRequest获取返回';无内容';成功后
我正在开发一个应用程序,它向RESTAPI发送一个帖子,RESTAPI在其响应中返回一个URI。然后,我要向该URI发出GET请求,它应该在响应体中返回HTML内容。但是,GET请求在其HTTP状态代码中返回“无内容” 奇怪的是,我有一个为测试目的而构建的小控制台应用程序,如果我将URI插入其中(允许我在不发布帖子的情况下测试GET),状态良好是200-OK,我会在主体中接收HTML内容。因此,这似乎与我在我的POST请求中正在做的事情有关。这是我的代码(敏感信息已被编辑):C# HttpWebRequest获取返回';无内容';成功后,c#,asp.net,httpwebrequest,httpwebresponse,system.net,C#,Asp.net,Httpwebrequest,Httpwebresponse,System.net,我正在开发一个应用程序,它向RESTAPI发送一个帖子,RESTAPI在其响应中返回一个URI。然后,我要向该URI发出GET请求,它应该在响应体中返回HTML内容。但是,GET请求在其HTTP状态代码中返回“无内容” 奇怪的是,我有一个为测试目的而构建的小控制台应用程序,如果我将URI插入其中(允许我在不发布帖子的情况下测试GET),状态良好是200-OK,我会在主体中接收HTML内容。因此,这似乎与我在我的POST请求中正在做的事情有关。这是我的代码(敏感信息已被编辑): private P
private PersonReportResults POSTReportRequest(PersonReportRequest报告请求)
{
var personReportResults=新的personReportResults();
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(“https://xxxxxxxxx.com/api/v1/personReport/reportResults");
var xDoc=new XmlDocument();
var serializedXml=Serialize(reportRequest);
LoadXml(序列化dxml);
var bytes=Encoding.ASCII.GetBytes(xDoc.OuterXml);
request.ContentType=“application/xml;encoding='utf-8';
request.ContentLength=字节.Length;
request.Method=“POST”;
request.KeepAlive=true;
request.Credentials=newnetworkcredential(ConfigurationManager.AppSettings[“xxxxx userid”]、ConfigurationManager.AppSettings[“xxxxx password”]);
request.ClientCertificates.Add(GetClientCertificate());
Stream requestStream=request.GetRequestStream();
requestStream.Write(字节、0、字节、长度);
requestStream.Close();
使用(var response=(HttpWebResponse)request.GetResponse())
{
if(response.StatusCode==HttpStatusCode.OK)
{
var responseStream=response.GetResponseStream();
使用(MemoryStream ms=new MemoryStream())
{
var计数=0;
做
{
字节[]buf=新字节[1024];
count=responseStream.Read(buf,0,1024);
ms.Write(buf,0,计数);
}while(responseStream.CanRead&&count>0);
ms.Position=0;
//现在尝试从内存流中取消序列化
var serializer=新的XmlSerializer(typeof(PersonReportResults));
personReportResults=((personReportResults)序列化程序.反序列化(ms));
}
response.Close();
}
request.Abort();
}
返回人员报告结果;
}
///
///对报告HTML发出HTTP GET请求
///
///URI。
///串
私有静态字符串GETResults(字符串uri)
{
var responseHTML=string.Empty;
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(uri+“?reportType=html”);
//request.ContentType=“application/xml;encoding='utf-8';
request.Method=“GET”;
request.Credentials=newnetworkcredential(ConfigurationManager.AppSettings[“xxxxx userid”]、ConfigurationManager.AppSettings[“xxxxx password”]);
request.ClientCertificates.Add(GetClientCertificate());
使用(var response=(HttpWebResponse)request.GetResponse())
{
if(response.StatusCode==HttpStatusCode.OK)
{
尝试
{
使用(var stream=response.GetResponseStream())
{
if(流!=null)
{
使用(MemoryStream ms=new MemoryStream())
{
var计数=0;
做
{
字节[]buf=新字节[1024];
count=stream.Read(buf,0,1024);
ms.Write(buf,0,计数);
}而(stream.CanRead&&count>0);
ms.Position=0;
var sr=新的StreamReader(毫秒);
responseHTML=sr.ReadToEnd();
}
//var reader=新的StreamReader(stream,Encoding.UTF8);
//responseHTML=reader.ReadToEnd();
}
}
}
捕获(例外e)
{
}
request.Abort();
}
else if(response.StatusCode==HttpStatusCode.Accepted)
{
response.Close();
var tryCount=1;
while(tryCount<5)
{
使用(var retryResponse=(HttpWebResponse)request.GetResponse())
{
if(retryResponse.StatusCode==HttpStatusCode.OK)
{
使用(var stream=retryResponse.GetResponseStream())
{
if(流!=null)
{
var reader=新的StreamReader(stream,Encoding.UTF8);
responseHTML=reader.ReadToEnd();
}
}
}
}
tryCount++;
睡眠(10000);
}
}
}
返回响应TML;
}
您是否尝试过使用类似Fiddler的工具来检查控制台应用程序和实际代码的HTTP请求?如果您在POST之后的GET调用中得到204,那么204仍然被认为是成功的——可能只是数据尚未完全写入。试着在第一次发帖之后,在开始发帖之前睡一觉。我还建议您尝试使用Fiddler或Runscope()之类的工具来调试它。使用Runscope,您不必安装任何东西——只需修改URL,使其通过Runscope进行代理,您就可以查看实时流量流(完整的请求和响应数据)。这里的文档:您是否尝试过使用som
private PersonReportResults POSTReportRequest(PersonReportRequest reportRequest)
{
var personReportResults = new PersonReportResults();
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://xxxxxxxxx.com/api/v1/personReport/reportResults");
var xDoc = new XmlDocument();
var serializedXml = Serialize(reportRequest);
xDoc.LoadXml(serializedXml);
var bytes = Encoding.ASCII.GetBytes(xDoc.OuterXml);
request.ContentType = "application/xml; encoding='utf-8'";
request.ContentLength = bytes.Length;
request.Method = "POST";
request.KeepAlive = true;
request.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["XXXXXUserId"], ConfigurationManager.AppSettings["XXXXXPassword"]);
request.ClientCertificates.Add(GetClientCertificate());
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
using (var response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode == HttpStatusCode.OK)
{
var responseStream = response.GetResponseStream();
using (MemoryStream ms = new MemoryStream())
{
var count = 0;
do
{
byte[] buf = new byte[1024];
count = responseStream.Read(buf, 0, 1024);
ms.Write(buf, 0, count);
} while (responseStream.CanRead && count > 0);
ms.Position = 0;
// now attempt to desrialize from the memory stream
var serializer = new XmlSerializer(typeof(PersonReportResults));
personReportResults = ((PersonReportResults)serializer.Deserialize(ms));
}
response.Close();
}
request.Abort();
}
return personReportResults;
}
/// <summary>
/// Makes a HTTP GET request for the report HTML
/// </summary>
/// <param name="uri">The URI.</param>
/// <returns>string</returns>
private static string GETResults(string uri)
{
var responseHTML = string.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri + "?reportType=html");
//request.ContentType = "application/xml; encoding='utf-8'";
request.Method = "GET";
request.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["XXXXXUserId"], ConfigurationManager.AppSettings["XXXXXPassword"]);
request.ClientCertificates.Add(GetClientCertificate());
using (var response = (HttpWebResponse)request.GetResponse())
{
if (response.StatusCode == HttpStatusCode.OK)
{
try
{
using (var stream = response.GetResponseStream())
{
if (stream != null)
{
using (MemoryStream ms = new MemoryStream())
{
var count = 0;
do
{
byte[] buf = new byte[1024];
count = stream.Read(buf, 0, 1024);
ms.Write(buf, 0, count);
} while (stream.CanRead && count > 0);
ms.Position = 0;
var sr = new StreamReader(ms);
responseHTML = sr.ReadToEnd();
}
//var reader = new StreamReader(stream, Encoding.UTF8);
//responseHTML = reader.ReadToEnd();
}
}
}
catch (Exception e)
{
}
request.Abort();
}
else if (response.StatusCode == HttpStatusCode.Accepted)
{
response.Close();
var tryCount = 1;
while (tryCount < 5)
{
using (var retryResponse = (HttpWebResponse)request.GetResponse())
{
if (retryResponse.StatusCode == HttpStatusCode.OK)
{
using (var stream = retryResponse.GetResponseStream())
{
if (stream != null)
{
var reader = new StreamReader(stream, Encoding.UTF8);
responseHTML = reader.ReadToEnd();
}
}
}
}
tryCount++;
Thread.Sleep(10000);
}
}
}
return responseHTML;
}