为什么在我的POST HttpWebRequest中编写XML会导致我的请求挂起.net 3.5而不是.net 4?

时间:2013-07-08 22:21:26

标签: c# .net-3.5 xmlwriter

因此,请使用以下代码(我们实际应用程序的非常简化的测试代码):

    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中完全挂起?

2 个答案:

答案 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.

}))
....