在后台代码中进行同步xmlhttp请求

本文关键字:同步 xmlhttp 请求 后台 代码 | 更新日期: 2023-09-27 18:14:53

我试图将XML发送到URL并读取响应,但每次响应都返回空。我认为这是因为它被异步处理,所以接收代码没有机会在我读取响应时完成。在javascript中,我会使用

xmlhttp.Open("POST", url, false);   

同步发送请求。我如何在c#中实现它?

我的代码现在是

HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
objRequest.Credentials = CredentialCache.DefaultCredentials;
objRequest.Method = "POST";
objRequest.ContentType = "text/xml";
Stream dataStream = objRequest.GetRequestStream();
byte[] bytes = new byte[UpliftJobXMLString.Length * sizeof(char)];
System.Buffer.BlockCopy(UpliftJobXMLString.ToCharArray(), 0, bytes, 0, bytes.Length);
dataStream.Write(bytes, 0, bytes.Length);
dataStream.Close();
HttpWebResponse response = (HttpWebResponse)objRequest.GetResponse();
System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream());
string respString = System.Web.HttpUtility.HtmlDecode(sr.ReadToEnd()); //always empty

谢谢

在后台代码中进行同步xmlhttp请求

我很确定这不是异步问题。你有没有检查sr.ReadToEnd()在HtmlDecode之前返回什么?

此外,您应该检查服务器是否返回了您期望它返回的内容。查看响应StatusCode和StatusDescription。如果您的服务器抛出内部服务器异常(500)或类似的东西,您读取的响应字符串将显示为空,因为响应的内容首先不会由服务器发送。

我不认为你的问题与同步/异步操作有关。将字符串转换为字节数组

的代码
byte[] bytes = new byte[UpliftJobXMLString.Length * sizeof(char)];
System.Buffer.BlockCopy(UpliftJobXMLString.ToCharArray(), 0, bytes, 0, bytes.Length);

类似于Unicode编码(每个字符2字节)。

查看编码之间的差异

string UpliftJobXMLString = "abcÜ";
byte[] bytesASCII = Encoding.ASCII.GetBytes(UpliftJobXMLString);
byte[] bytesUTF8 = Encoding.UTF8.GetBytes(UpliftJobXMLString);
byte[] bytesUnicode = Encoding.Unicode.GetBytes(UpliftJobXMLString);

因此,要么将内容编码设置为unicode,要么使用其他编码。例;

objRequest.ContentType = "text/xml; charset=utf-8";