Pergunta

Eu estou tentando fazer um HTTP POST para um servidor web Apache.

Eu estou achando que a criação ContentLength parece ser necessária para o pedido de trabalho.

Eu preferiria criar um XmlWriter diretamente do GetRequestStream () e set SendChunked a verdade, mas a trava pedido indefinidamente quando fazê-lo.

Aqui está como o meu pedido é criado:

    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;
    }

Como posso fazer o trabalho SendChunked então eu não tenho que definir ContentLength? Eu não vejo uma razão para guardar em algum lugar corda do XmlWriter antes de enviá-lo para o servidor.

EDIT: Aqui está o meu código causando o problema:

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

Antes eu não ter uma utilização sobre o objecto sequência devolvido do GetRequestStream (), presumi XmlWriter fechado quando o fluxo dispostas, mas este não é o caso.

Uma das respostas abaixo, deixe-me a isso. Vou marcá-los como a resposta.

Quanto HttpWebRequest está em causa, o meu código original funciona muito bem.

Foi útil?

Solução

Isso deve funcionar da maneira que você tê-lo escrito. podemos ver o código que realmente faz o upload? Você está lembrando-se de fechar o fluxo?

Outras dicas

Olhando para o exemplo em http: // msdn.microsoft.com/en-us/library/system.net.httpwebrequest.sendchunked.aspx eles ainda definir um comprimento de conteúdo. Realmente a linha de fundo é que se você está enviando dados que você precisa dizer ao receptor a quantidade de dados que você estará enviando. Por que você não sabe a quantidade de dados que você está enviando antes de enviar o pedido?

ContentLength:

Valor de propriedade Tipo: System .. :: Int64. O número de bytes de dados para enviar para o recurso da Internet. O padrão é -1, o que indica a propriedade não foi definido e que não há dados pedido de envio.

Editar para Aaron (eu estava errado):

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

De 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));
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top