web-dev-qa-db-fra.com

Comment utiliser HttpWebRequest avec la méthode GET

J'ai le code suivant qui fonctionne très bien lorsque la méthode est "POST", mais passer à "GET" ne fonctionne pas:

HttpWebRequest request = null;
request = HttpWebRequest.Create(uri) as HttpWebRequest;
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Method = "POST"; // Doesn't work with "GET"

request.BeginGetRequestStream(this.RequestCallback, null);

J'obtiens une exception ProtocolViolationException avec la méthode "GET".

Edit: Après avoir jeté un œil à l'aide de Reflector, il semble qu'il y ait une vérification explicite de la méthode "GET", si elle est définie sur celle-ci, elle lève l'exception.

Edit2: J'ai mis à jour mon code comme suit, mais il lève toujours une exception lorsque j'appelle EndGetResponse ()

if (request.Method == "GET")
{
    request.BeginGetResponse(this.ResponseCallback, state);
}
else
{
    request.BeginGetRequestStream(this.RequestCallback, state);
}

Dans ma fonction, ResponseCallback, j'ai ceci:

HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asyncResult);

Ce qui lève également l'exception.

Réponse

Le code ci-dessus fonctionne maintenant, j'avais oublié de supprimer la ligne Content-Type qui provoquait la levée de l'exception à la fin. +1 pour peaufiner et répondre à Jon.

Le code de travail est maintenant ci-dessous:

HttpWebRequest request = null;
request = HttpWebRequest.Create(uri) as HttpWebRequest;
request.Method = "GET";// Supports POST too

if (request.Method == "GET")
{
    request.BeginGetResponse(this.ResponseCallback, state);
}
else
{
    request.BeginGetRequestStream(this.RequestCallback, state);
}
28
Mark Ingram

C'est spécifié dans la documentation . Fondamentalement, les requêtes GET ne sont pas censées contenir des corps, il n'y a donc aucune raison raisonnable d'appeler BeginGetRequestStream.

12
Jon Skeet

Est-il judicieux pour une demande GET d'envoyer un Content-Type? Avez-vous essayé de supprimer la troisième ligne?

5
Mark Renouf

Il est spécifié dans la documentation de GetRequestStream qu'il lèvera une exception ProtocolViolationException si la méthode est GET. Cependant, je ne trouve rien dans spécification HTTP pour suggérer qu'il s'agit en fait d'une violation du protocole HTTP. Considérez cela comme un défi.

1
MarkPflug

BeginGetRequestStream est utilisé pour obtenir un flux spécifiquement pour écrire des données dans la demande. Cela ne s'applique pas aux demandes GET.

La documentation de la méthode BeginGetRequestStream indique explicitement que la méthode lèvera une exception ProtocolViolationException si la méthode est GET ou HEAD.

Moral: lire la documentation ;-)

1
Tor Haugen