3

Apache Web サーバーに対して HTTP POST を実行しようとしています。

リクエストが機能するには、ContentLength の設定が必要なようです。

GetRequestStream() から直接 XmlWriter を作成し、SendChunked を true に設定したいのですが、そうするとリクエストが無期限にハングします。

リクエストの作成方法は次のとおりです。

    private HttpWebRequest MakeRequest(string url, string method)
    {
        HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;
        request.Method = method;
        request.Timeout = Timeout; //Property in my class, assume it's 10000
        request.ContentType = "text/xml"; //I am only writing xml with XmlWriter
        if (method != WebRequestMethods.Http.Get)
        {
            request.SendChunked = true;
        }
        return request;
    }

ContentLength を設定する必要がないように、SendChunked を機能させるにはどうすればよいですか? サーバーに送信する前に XmlWriter の文字列をどこかに保存する理由がわかりません。

編集:問題を引き起こしている私のコードは次のとおりです:

    using (Stream stream = webRequest.GetRequestStream())
    {
        using (XmlWriter writer = XmlWriter.Create(stream, XmlTags.Settings))
        {
            Generator.WriteXml<TRequest>(request, writer);
        }
    }

GetRequestStream() から返された Stream オブジェクトを使用しない前は、XmlWriter が破棄されたときにストリームを閉じると想定していましたが、そうではありませんでした。

以下の答えの1つ、これにさせてください。それらを答えとしてマークします。

HttpWebRequest に関する限り、元のコードは問題なく動作します。

4

3 に答える 3

3

これは、記述したとおりに機能するはずです。実際にアップロードを行うコードを見ることができますか? ストリームを閉じることを覚えていますか?

于 2009-12-14T18:03:05.980 に答える
1

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.sendchunked.aspxの例を見ると、コンテンツの長さはまだ設定されています。本当に重要なのは、データを送信する場合は、送信するデータの量を受信者に伝える必要があるということです。リクエストを送信する前に、送信しているデータの量がわからないのはなぜですか?

ContentLength:

プロパティ値 タイプ:System..::。Int64インターネットリソースに送信するデータのバイト数。デフォルトは-1です。これは、プロパティが設定されておらず、送信する要求データがないことを示します。

アーロンのために編集(私は間違っていた):

HttpWebRequest httpWebRequest = HttpWebRequest.Create("http://test") as HttpWebRequest;
httpWebRequest.SendChunked = true;
MessageBox.Show("|" + httpWebRequest.TransferEncoding + "|");

System.Net.HttpWebRequest.SerializeHeaders()から:

if (this.HttpWriteMode == HttpWriteMode.Chunked)
{
    this._HttpRequestHeaders.AddInternal("Transfer-Encoding", "chunked");
}
else if (this.ContentLength >= 0L)
{
    this._HttpRequestHeaders.ChangeInternal("Content-Length", this._ContentLength.ToString(NumberFormatInfo.InvariantInfo));
}
于 2009-12-14T18:19:45.263 に答える