HttpWebRequest Vs HttpClient
J'ai un morceau de code qui fonctionne à l'aide d'un HttpWebRequest et HttpWebResponse mais je voudrais le convertir en utiliser HttpClient et HttpResponseMessage.
C'est le morceau de code qui fonctionne...
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(serviceReq);
request.Method = "POST";
request.ContentType = "text/xml";
string xml = @"<?xml version=""1.0""?><root><login><user>flibble</user>" +
@"<pwd></pwd></login></root>";
request.ContentLength = xml.Length;
using (StreamWriter dataStream = new StreamWriter(request.GetRequestStream()))
{
dataStream.Write(xml);
dataStream.Close();
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Et c'est le code que je voudrais le remplacer avec, si seulement je pouvais le faire fonctionner.
///<summary>
///Validate the user credentials held as member variables
///</summary>
///<returns>True if the user credentials are valid, else false</returns>
public bool ValidateUser()
{
bool valid = false;
try
{
//Create the XML to be passed as the request
XElement root = BuildRequestXML("LOGON");
//Add the action to the service address
Uri serviceReq = new Uri(m_ServiceAddress + "?obj=LOGON");
//Create the client for the request to be sent from
using (HttpClient client = new HttpClient())
{
//Initalise a response object
HttpResponseMessage response = null;
//Create a content object for the request
HttpContent content = HttpContentExtensions.
CreateDataContract<XElement>(root);
//Make the request and retrieve the response
response = client.Post(serviceReq, content);
//Throw an exception if the response is not a 200 level response
response.EnsureStatusIsSuccessful();
//Retrieve the content of the response for processing
response.Content.LoadIntoBuffer();
//TODO: parse the response string for the required data
XElement retElement = response.Content.ReadAsXElement();
}
}
catch (Exception ex)
{
Log.WriteLine(Category.Serious,
"Unable to validate the Credentials", ex);
valid = false;
m_uid = string.Empty;
}
return valid;
}
Je pense que le problème est la création de l'objet de contenu et le format XML n'est pas attaché correctement (peut-être).
- Qu'est-ce exactement ne fonctionne pas? N'est-ce pas compiler? Ou ne vous obtenez des erreurs d'exécution? Quelles erreurs?
- Quelle est l'erreur?
- La demande est envoyée, mais le service qui gère la requête entrante pense qu'il y a pas de données et, par conséquent, renvoie "Accès non autorisé", qui est la réponse par défaut pour ce service.
- Utiliser Fiddler et vérifier ce qui est envoyé sur le fil...
- Merci pour l'orienter sur l'utilisation de Violoneux. Après beaucoup de difficultés, j'ai réussi à obtenir de l'fiddler de travail et à la capture de la demande/réponse de chaque approche. Il y a 2 différences. Le code de travail a <?xml version="1.0"?> dans les données brutes et le type de contenu text/xml. Le non code du travail ne comprend pas le <?xml version="1.0"?>, et le type de contenu est défini en tant que application/xml. Ma prochaine étape sera de travailler sur la façon de modifier le type de contenu.
Vous devez vous connecter pour publier un commentaire.
La
HttpClient.Post
méthode a une surcharge qui prend uncontentType
paramètre, essayez ceci:J'aimerais savoir la raison pour laquelle une approche ne fonctionne pas et l'autre mais je n'ai pas le temps pour tout plus de creuser. {:o(
De toute façon, voici ce que j'ai trouvé.
Une défaillance se produit lorsque le contenu de la demande est créée à l'aide de la suite de
Mais il fonctionne correctement lorsque vous créez le contenu comme celui-ci...
Le travail final de la fonction est: est-ce
Grâce.