C # - HttpWebRequest - POST - PullRequest
       11

C # - HttpWebRequest - POST

3 голосов
/ 14 декабря 2009

Я пытаюсь создать протокол HTTP POST для веб-сервера Apache.

Я считаю, что настройка ContentLength необходима для того, чтобы запрос работал.

Я бы лучше создал XmlWriter непосредственно из GetRequestStream () и установил для 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;
    }

Как я могу заставить SendChunked работать так, чтобы мне не нужно было устанавливать ContentLength? Я не вижу причин хранить где-нибудь строку XmlWriter перед отправкой на сервер.

РЕДАКТИРОВАТЬ: Вот мой код, вызывающий проблему:

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

Прежде чем у меня не было использования объекта Stream, возвращенного из GetRequestStream (), я предполагал, что XmlWriter закрыл поток при удалении, но это не так.

Один из ответов ниже, позвольте мне на это. Я отмечу их как ответ.

Что касается HttpWebRequest, мой оригинальный код работает просто отлично.

Ответы [ 2 ]

3 голосов
/ 14 декабря 2009

Это должно работать так, как вы написали. Можем ли мы увидеть код, который на самом деле выполняет загрузку? Вы помните, чтобы закрыть поток?

1 голос
/ 14 декабря 2009

Глядя на пример на 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...