C # - HttpWebRequest - POST
-
19-09-2019 - |
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.
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));
}