因此,请使用以下代码(我们实际应用程序的非常简化的测试代码):
public string Test()
{
string content = @"<entry xmlns:yt=""http://gdata.youtube.com/schemas/2007"" xmlns:media=""http://search.yahoo.com/mrss/"" xmlns=""http://www.w3.org/2005/Atom""><title>Matt Test Event</title><summary>Testing 1234</summary><yt:when start=""2013-07-08T21:56:49.434569Z"" /></entry>";
string requestUrl =
"https://gdata.youtube.com/feeds/api/users/xossports/live/events/fv7cuJbtZrGzYFNNa-WfWubz3qleq8ai?inline=true";
var request = (HttpWebRequest)WebRequest.Create(requestUrl);
request.Accept = "application/atom+xml";
request.ContentType = "application/atom+xml";
request.Headers.Add("GData-Version", "2");
request.Headers.Add("X-GData-Key", string.Concat("key=", DEVELOPER_KEY));
request.Method = HttpMethods.Post;
//using (var writer = new StreamWriter(request.GetRequestStream()))
// writer.Write(content);
var requestBody = XDocument.Parse(content);
using (var writer = XmlWriter.Create(request.GetRequestStream()))
requestBody.Save(writer);
using (var response = (HttpWebResponse)request.GetResponse())
using (var reader = new StreamReader(response.GetResponseStream()))
return reader.ReadToEnd();
}
static void Main(string[] args)
{
using (var service = new YouTubeService())
Console.WriteLine(service.Test());
}
当我在一个针对.Net 4框架的控制台应用程序中运行它时,一切正常(我正确得到了一个401错误的请求响应,因为有些事情在这方面没有正确设置)。
但是,如果我在我的应用程序定位到.Net 3.5框架时运行此程序,它会在request.GetResponse()
调用时冻结。没有错误,永远不会超时,只是无限期地挂起。
注释掉的StreamWriter()
调用表明,当我将简单的字符串写入流而不是使用XmlWriter时,它的工作完全正常,所以虽然我有完美的工作(在拔毛后数小时)任何人都知道为什么XmlWriter
导致响应调用仅在.net 3.5中完全挂起?
答案 0 :(得分:1)
在4.0中,当您致电HttpWebRequest.GetResponse()
时,它会&#34;关闭&#34;如果请求流之前没有完成,则请求继续。在3.5,它将保持打开状态并等待它在发送请求之前关闭。
最简单的&#34;修复&#34; (或解决方法)是在写入请求流后显式关闭它:
var requestBody = XDocument.Parse(content);
using (var writer = XmlWriter.Create(request.GetRequestStream()))
{
requestBody.Save(writer);
}
request.GetRequestStream().Close();
答案 1 :(得分:0)
我不知道为什么3.5和4.0之间会有区别。 XmlWriter似乎没有那么多改变或根本没有改变。 但是,在创建XmlWriter时没有设置一些XmlWriterSettings属性时遇到了一些错误,我会尝试:
using (var writer = XmlWriter.Create(request.GetRequestStream(), new XmlWriterSettings{
CloseOutput = true,
Encoding = Encoding.UTF-8 // not sure of this syntax. check it out.
}))
....