mercoledì 17 aprile 2013

POST WebRequest e Content-Type


C# 2.0

Dovevo effettuare una richiesta POST ad un Url passando alcuni parametri e per far questo ho utilizzato le seguenti righe di codice:

string url = "http://pippo.it/api";

WSSEDigest wsseDigest = new WSSEDigest();
string token = wsseDigest.GetPasswordDigestAsBase64(userName, password);

HttpWebRequest webReq = (HttpWebRequestWebRequest.Create(url);
webReq.Method = "POST";
webReq.Headers["X-WSSE"] = token;
webReq.ContentType = "application/x-www-form-urlencoded";

ASCIIEncoding encoding = new ASCIIEncoding();
byte[] data = encoding.GetBytes(uriRequestBurn.Parameters);
Stream requestParametersStream = webReq.GetRequestStream();
requestParametersStream.Write(data, 0, data.Length);
requestParametersStream.Close();

try
{
    HttpWebResponse webResp = (HttpWebResponse) webReq.GetResponse();
    Stream answer = webResp.GetResponseStream();
    StreamReader answerReader = new StreamReader(answer);
    string responseContent = answerReader.ReadToEnd();
}
catch (WebException ex)
{
    Stream answer = ex.Response.GetResponseStream();
    StreamReader answerReader = new StreamReader(answer);
    string message = ex.Message;
    string responseContent = answerReader.ReadToEnd();                       
}

Inizialmente non specificavo il content-type ed avevo la seguente anomalia: per alcune chiamate tutto andava bene per altre invece mi ritornava sempre una Web Eception, anche analizzando il flusso dati con Fiddler tutto mi sembrava corretto, i parametri  sembravano sempre valorizzati allo stesso modo, peccato però che dalla parte del servizio arrivasse, in questo caso, sempre un array vuoto.

Alla fine grazie al Plug-In Poster di Firefox sono riuscito a capire che il problema stava nel Content-Type.