Puis-je réutiliser HttpWebRequest sans vous déconnecter du serveur?
Je suis en train de déboguer un problème spécifique avec mon ASP.NET application. Le client exécute le code suivant:
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
}
et Write()
déclenche une exception avec "Impossible d'écrire des données sur la connexion de transport: Une connexion établie a été abandonnée par le logiciel sur votre ordinateur hôte." du texte. J'ai utilisé System.Net traçage et a constaté que quelque chose se passe mal lors de l'envoi de la requête avec Content-Length
ensemble.
Spécifiquement si je omettre tout ce qui est à l'intérieur de using
énoncé dans le code ci-dessus, le serveur répond promptement avec WWW-Authenticate
et puis le client reposte la demande avec WWW-Authenticate
et tout va bien sauf le fichier dans pas transféré et la demande ne parvient pas beaucoup plus tard.
J'aimerais effectuer les opérations suivantes: envoyer une demande en l'absence de données, d'attendre WWW-Authenticate
, puis répétez avec WWW-Authenticate
et de données. J'ai donc essayé de modifier le code ci-dessus: d'abord régler tous les paramètres, puis appel GetResponse()
, puis de faire de l'envoi, mais lorsque je tente de régler ContentLength
bien une exception est levée avec "Cette propriété ne peut pas être défini après l'écriture a commencé" du texte.
Donc HttpWebRequest
semble être non-réutilisables.
Comment puis-je réutiliser pour la réexpédition de la demande sans fermer la connexion?
Pas de solution si vous utilisez l'authentification avec le nonce. Si vous utilisez quelque chose comme l'authentification de base, vous pouvez simplement mettre "Autorisation" en-têtes de sorte qu'il n'y a pas
WWW-Authenticate
phase.Mais je suis d'erreur à la ligne du ruisseau.Write( buffer, 0, bytesRead )", alors quelle est la solution pour cela. Pouvez vous s'il vous plaît fournir votre code modifié , afin que je puisse mieux comprendre. Merci
C'était il y a si longtemps, je me souviens à peine plus de détails. Je suppose que votre meilleur pari est de poser une question séparée avec tous les détails de votre situation.
OriginalL'auteur sharptooth | 2011-02-08
Vous devez vous connecter pour publier un commentaire.
Vous ne les réutilisez pas une demande - comme son nom l'indique, c'est une demande. Toutefois, si vous exécutez plusieurs demandes pour le même hôte, .NET va réutiliser le réseau sous-jacent de connexion par défaut.
Notez que vous ne besoin de disposer de l'
WebResponse
retourné parrequest.GetResponse
- sinon, l'infrastructure sous-jacente de ne pas savoir qui vous êtes réellement fait avec elle, et de ne pas être en mesure de réutiliser la connexion.(En aparté, pourquoi êtes-vous à l'aide de
BinaryReader
? Suffit d'utiliser le flux renvoyé parFile.OpenRead
directement.)Juste, mais quel autre mécanisme pourrais-je utiliser pour résoudre mon problème spécifiquement que j'ai besoin d'obtenir authentifié, puis de réutiliser le même
WWW-Authenticate
?Il n'est pas clair pourquoi vous ne pouvez pas saisir l'en-tête de la réponse et de l'utiliser dans la prochaine demande. Pourquoi pensez-vous que vous avez de réutiliser le même objet?
Eh bien, je suppose que le serveur va être paranoïaque si il utilise quelque chose comme Digest-MD5 avec le nonce - le nonce ne sera valable que pour la même connexion de sorte qu'aucun tiers ne peut en écouter et usurper l'identité de lui-même comme le véritable client. C'est pourquoi je suppose que j'ai besoin de garder la connexion TCP ouverte.
Je ne m'attends pas que ce soit le cas. HTTP n'est pas conçu pour cela: il est conçu comme une demande/réponse de protocole, et de la réutilisation de la même connexion doit être un détail d'implémentation. (Comme je l'ai dit, il est probablement utiliser la même connexion de toute façon, mais vous ne devriez pas vraiment penser à ce sujet.)
OriginalL'auteur Jon Skeet
En plus de l'Jon Skeet réponse, vous n'avez pas besoin de régler manuellement la ContentLength de la propriété. HttpWebRequest auto calculer et remplir cette propriété.
OriginalL'auteur Genady Sergeev