2017-07-19 1 views
0

Je développe une application wpf C# qui a une fonctionnalité de connexion à mon site Web et de téléchargement du fichier. Ce site a un attribut Authorize sur son action. J'ai besoin de 2 cookies pour pouvoir télécharger le fichier, le premier cookie est pour moi pour me connecter, le deuxième cookie (qui est fourni après une connexion réussie) est pour moi le téléchargement du fichier. Donc je suis venu avec le flux de garder mes cookies après mon httpwebrequest/httpwebresponse. Je regarde mon flux d'affectation comme peut-être c'est le problème. Voici mon code.C#: HttpWebRequest Les données POST ne fonctionnent pas

void externalloginanddownload() 
{ 
    string pageSource = string.Empty; 
    CookieContainer cookies = new CookieContainer(); 

    HttpWebRequest getrequest = (HttpWebRequest)WebRequest.Create("login uri"); 
    getrequest.CookieContainer = cookies; 
    getrequest.Method = "GET"; 
    getrequest.AllowAutoRedirect = false; 

    HttpWebResponse getresponse = (HttpWebResponse)getrequest.GetResponse(); 

    using (StreamReader sr = new StreamReader(getresponse.GetResponseStream())) 
    { 
     pageSource = sr.ReadToEnd(); 
    } 

    var values = new NameValueCollection 
    { 
       {"Username", "username"}, 
       {"Password", "password"}, 
     { "Remember me?","False"}, 
      }; 

    var parameters = new StringBuilder(); 

    foreach (string key in values.Keys) 
    { 
     parameters.AppendFormat("{0}={1}&", 
      HttpUtility.UrlEncode(key), 
      HttpUtility.UrlEncode(values[key])); 
    } 

    parameters.Length -= 1; 

    HttpWebRequest postrequest = (HttpWebRequest)WebRequest.Create("login uri"); 
    postrequest.CookieContainer = cookies; 
    postrequest.Method = "POST"; 

    using (var writer = new StreamWriter(postrequest.GetRequestStream())) 
    { 
     writer.Write(parameters.ToString()); 
    } 

    using (WebResponse response = postrequest.GetResponse()) // the error 500 occurs here 
    { 
     using (var streamReader = new StreamReader(response.GetResponseStream())) 
     { 
      string html = streamReader.ReadToEnd(); 

     } 
    } 
} 
+0

vous n'avez pas mentionné le problème que vous rencontrez. Où échoue-t-il? –

+0

il échoue donnant la réponse du httpwebrequest avec une méthode POST. il me donne une erreur 500. –

+0

et pourquoi faites-vous cela?: paramètres.Length - = 1; –

Répondre

1

Lorsque vous obtenez WebResponse, les biscuits retournés seront dans la réponse, et non pas dans la demande (assez curieusement, même si vous devez CookieContainer à la demande).

Vous devrez ajouter les cookies de l'objet de réponse à votre CookieContainer, afin qu'il soit envoyé à la prochaine demande.

Une façon simple:

for(var cookie in getresponse.Cookies) 
    cookies.Add(cookie) 

Puisque les biscuits en réponse est déjà un conteneur de cookies, vous pouvez le faire (peut aider à vérifier la valeur NULL dans le cas où tous les cookies étaient déjà là)

if (response.Cookies != null) cookies.Add(response.Cookies) 

vous pouvez également avoir des problèmes avec votre POST que vous devez définir ContentType et longueur:

myWebRequest.ContentLength = parameters.Length; 
myWebRequest.AllowWriteStreamBuffering = true; 

Si vous avez des caractères multi-octets à considérer, vous devrez peut-être également y remédier en définissant le codage sur UTF-8 dans la requête et le constructeur de chaîne, et en convertissant la chaîne en octets et en utilisant cette longueur.

Autre astuce: certains codes du serveur Web se bloquent s'il n'y a pas d'agent utilisateur. Essayez:

myWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"; 

Et juste au cas où vous avez des caractères multi-octets, il est préférable de le faire:

var databytes = System.Text.Encoding.UTF8.GetBytes(parameters.ToString()); 
myWebRequest.ContentLength = databytes.Length; 
myWebRequest.ContentType = "application/x-www-form-urlencoded; charset=utf-8"; 
using (var stream = myWebRequest.GetRequestStream()) 
{ 
    stream.Write(databytes, 0, databytes.Length); 
} 
+0

La réponse * devrait * inclure seulement les nouveaux cookies qui ne figuraient pas dans la requête, donc faire ceci après que chaque requête ait accompli ce que vous voulez –

+0

je ne suis pas sûr de l'application/x-www-form-urlencoded Les valeurs que je passe à l'action sont placées sur l'URL? –

+0

"application/x-www-form-urlencoded" signifie essentiellement que les paramètres post sont formatés comme "clé = valeur & clé = valeur ..." par opposition à l'encodage json ou un autre type. –

0

En application C# (côté serveur API Web) Activez le C++ Exception et Common Language Run Exceptions de temps en utilisant (Ctrl + Alt + E) quelle est l'Exception du côté serveur qu'il est lancé.

D'abord, vérifiez que les données sont correctement liées. Après vous pouvez voir ce que c'est Exact Exception. l'erreur de serveur interne La plupart du temps jeter les données n'est pas le format correct et pas correctement géré Exception.