2017-06-20 3 views
0

J'ai lu d'innombrables questions liées à mon problème, mais aucun d'entre eux ont résolu mon problème. Je fais un HttpWebRequest en C# dans lequel je publie des données et ensuite lire la réponse sauf que la réponse retourne toujours comme vide. J'ai essayé de changer request.contentType, codant les données dans divers formats de ASCII non codé, & UTF8. Peu importe ce que je fais, ma réponse est vide. De plus comme une note de côté, ma demande va à travers la couche 7.C# HttpWebRequest retourne vide

var request = (HttpWebRequest)WebRequest.Create(serviceURL); 
var postData = "\"device\"=\"9856\""; 
var data = Encoding.ASCII.GetBytes(postData); 
//request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentType = "application/json; charset=utf-8"; 
request.Timeout = 5000; 
request.Headers.Add("Authorization", b64); 
request.Headers.Add("reqtime", hmacTS); 
request.Headers.Add("appkey", APP_KEY1); 
request.Method = "POST"; 
request.ContentLength = data.Length; 

try 
{ 
    using (var stream = request.GetRequestStream()) 
    { 
     stream.Write(data, 0, data.Length); 
    } 
    var response = (HttpWebResponse)request.GetResponse(); 
    using (var streamReader = new StreamReader(response.GetResponseStream())) 
    { 
     var result = streamReader.ReadToEnd(); 
     updateWindow(this, "Results: " + result); 
     updateWindow(this, "Type: " + response.ContentType); 
     updateWindow(this, "Content Length: " + response.ContentLength); 
    } 
} 
catch (WebException a) 
{ 
    updateWindow(this, "ERROR: " + a); 
} 

Mon spectacle de réponse que:

Results: 
Type: application/octet-stream 
Content Length: 0 

Juste pour mettre à jour tout le monde, je suis finalement arrivé à la racine du problème. Le fournisseur de services a dû redémarrer son serveur car la connexion à la base de données s'était éteinte. Après environ une semaine de combat avec ce code, je suppose qu'ils ont décidé de vérifier enfin pour moi ..... Merci à tous ceux qui ont essayé d'aider!

+4

Avez-vous essayé d'utiliser quelque chose comme Fiddler pour réellement ** voir ** ce que vous envoyez et recevez sur le fil? –

+0

Oui, j'ai utilisé un violoniste et le corps semble être correct. Le violoneux ne montre aucune exception à la transaction. – Konan

+0

Je ne vois pas de corps de réponse dans le violoneux. Apparemment, je n'ai rien en retour .. Contenu-Longueur: 0, Type de contenu: application/octet-stream – Konan

Répondre

0
public static bool GetResponseForJson(string url, out object jsonObject) 
{ 
    bool result; 

    try { 

    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); 
    webRequest.Method = "POST"; 
    HttpWebResponse httpWebResponse = (HttpWebResponse)webRequest.GetResponse(); 
    StreamReader sr = new StreamReader(httpWebResponse.GetResponseStream()); 
    jsonObject = new JavaScriptSerializer().DeserializeObject(sr.ReadToEnd()); 
    result = true; 
    } 
    catch { 

    jsonObject = null; 
    result = false; 
    } 
    return result; 
} 

C'est une méthode que j'utilise pour obtenir des objets de réponse à partir d'une URL, vous pouvez changer webRequest.Method GET etcetera.

+0

Merci pour la sugguestion. Votre code est à peu près le même que le mien à l'exception de la désérialisation de Json. J'ai essayé cette suggestion mais ma réponse est toujours vide. – Konan

+0

@Konan alors dans votre cas, sr.ReadToEnd() retourne une chaîne vide? – Peter

+0

oui, il est vide – Konan

0

Vérifiez d'abord le code HTTP respone. Vous utilisez également l'autorisation. Vérifiez si la valeur de l'en-tête Authorization est correcte. Dans le cas où vous utilisez l'autorisation de jeton au porteur, vous devez mettre "support" avant le jeton réel dans l'en-tête.

+0

J'utilise l'autorisation et ma valeur d'en-tête d'autorisation est correcte. Si j'obtenais une exception à travers le calque 7, cela ne montrerait-il pas une forme d'erreur? – Konan

+0

Cela dépend de l'implémentation backend. Le bon moyen est de retourner le statut via le code HTTP. –