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 に答える