1

所以取下面的代码(我们实际应用的非常简化的测试代码):

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

4

2 回答 2

1

在 4.0 中,当您调用 时HttpWebRequest.GetResponse(),如果之前没有完成,它将“关闭”请求流,因此请求会继续。在 3.5 上,它将保持打开状态,并在发送请求之前等待它关闭。

最简单的“修复”(或解决方法)是在写入请求流后显式关闭它:

var requestBody = XDocument.Parse(content);
using (var writer = XmlWriter.Create(request.GetRequestStream()))
{
    requestBody.Save(writer);
}
request.GetRequestStream().Close();
于 2013-07-08T23:00:13.973 回答
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.

}))
....
于 2013-07-08T22:49:52.570 回答