2013-05-22 27 views
1

我正在尝试将XML发送到URL并读取响应,但响应每次都会回来。我认为这是因为它被异步处理,所以当我阅读响应时,接收代码没有机会完成。在Javascrpt我会用在代码后面执行同步xmlhttp请求

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 

感谢

回答

1

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

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"; 
+1

谢谢,这解释了很多。 Encoding.UTF8对它进行排序。 –

2

我相当肯定,这不是一个异步的问题。你有没有检查过sr.ReadToEnd()返回HtmlDecode之前?

此外,您应该检查服务器是否正在返回您期望的返回结果。检查响应状态码和状态描述。如果你的服务器抛出一个内部服务器异常(500)或类似的东西,你读取的响应字符串会变空,因为响应的内容首先不会被服务器发送。