Estoy tratando de depurar a specific issue with my ASP.NET application. El cliente se ejecuta el siguiente código:¿Puedo reutilizar HttpWebRequest sin desconectarme del servidor?
void uploadFile(string serverUrl, string filePath)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.
Create(serverUrl);
CredentialCache cache = new CredentialCache();
cache.Add(new Uri(serverUrl), "Basic", new NetworkCredential("User", "pass"));
request.Credentials = cache;
request.Method = "POST";
request.ContentType = "application/octet-stream";
request.Timeout = 60000;
request.KeepAlive = true;
using(BinaryReader reader = new BinaryReader(
File.OpenRead(filePath))) {
request.ContentLength = reader.BaseStream.Length;
using(Stream stream = request.GetRequestStream()) {
byte[] buffer = new byte[1024];
while(true) {
int bytesRead = reader.Read(buffer, 0, buffer.Length);
if(bytesRead == 0) {
break;
}
stream.Write(buffer, 0, bytesRead);
}
}
}
HttpWebResponse result = (HttpWebResponse)request.GetResponse();
//handle result - not relevant
}
y Write()
tiros con una excepción "No se puede escribir datos en la conexión de transporte: una conexión establecida fue abortado por el software en su ordenador central." texto. Usé System.Net tracing y descubrí que algo va mal cuando envío la solicitud con el Content-Length
conjunto.
concreto, si omito todo lo que está dentro using
comunicado en el código anterior el servidor responde con prontitud con WWW-Authenticate
y luego el cliente reposts la solicitud con WWW-Authenticate
y todo va bien, excepto el archivo en no ha subido y la solicitud no mucho más tarde.
Me gustaría hacer lo siguiente: enviar una solicitud sin datos, esperar a WWW-Authenticate
, luego repetirlo con WWW-Authenticate
y los datos. Así que traté de modificar el código anterior: primero configuré todos los parámetros, luego llamé al GetResponse()
, luego realicé el envío, pero cuando intento establecer la propiedad ContentLength
, se lanza una excepción con el texto "Esta propiedad no puede establecerse después de que el texto haya comenzado".
Así que HttpWebRequest
parece ser no reutilizable.
¿Cómo lo vuelvo a utilizar para volver a enviar la solicitud sin cerrar la conexión?
También tengo el mismo problema. Si obtuvo la solución, proporcione o muestre el nuevo código modificado que me ayudará. – Herin
@Herin: no hay solución si usa autenticación con nonce. Si usa algo así como la autenticación básica, puede simplemente configurar los encabezados de "Autorización" para que no haya una fase 'WWW-Authenticate'. – sharptooth
Pero si recibo un error en la línea 'stream.Write (buffer, 0, bytesRead)' entonces, ¿cuál es la solución para eso? ¿Puedes proporcionar tu código modificado para que pueda entender mejor? Gracias – Herin