C#の - のHttpWebRequest - POST
-
19-09-2019 - |
質問
私は、Apache WebサーバへのHTTP POSTを作成しようとしています。
私は、要求が機能するためん。ContentLengthを設定することが必要としているように見えることを発見しています。
そうするとき、私はむしろ、無期限GetRequestStream()とtrueにSendChunkedセットが、リクエストがハングから直接のXmlWriterを作成することになります。
ここに私の要求が作成される方法です。
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);
}
}
Iは、ストリームオブジェクトで使用して持っていなかった前)GetRequestStream(から返された、私が配置されたときのXmlWriterストリームを閉じたと仮定、これは当てはまらない。
以下の答えの一つは、これにさせて頂いております。私は答えとしてマークします。
限りHttpWebRequestのを懸念しているように、私の元のコードだけで正常に動作します。
解決
これは、あなたがそれが書かれているように動作しなければなりません。私たちは実際にアップロードを行うコードを見ることができますか?あなたは、ストリームを閉じるために覚えていますか?
他のヒント
で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));
}