Вопрос

Я пытаюсь отправить Http-сообщение на веб-сервер 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);
        }
    }

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

Позвольте мне ответить на один из приведенных ниже ответов.Я отмечу их как ответ.

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

Это было полезно?

Решение

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

Другие советы

Рассматривая пример на http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.sendchunked.aspx они по-прежнему устанавливают длину контента.На самом деле суть в том, что если вы отправляете данные, вам нужно сообщить получателю, сколько данных вы будете отправлять.Почему вы не знаете, какой объем данных вы отправляете, прежде чем отправлять запрос?

Длина содержимого:

Стоимость недвижимости Тип: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));
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top