locked
Post d'une image avec HttpClient ou HttpWebRequest, l'HttpResponse retourne Serveur Not Found si la requête est trop lente RRS feed

  • Discussion générale

  • Bonjour, 
    Je me casse les dents depuis deux jours sur l'envoi d'images vers un serveur depuis Windows Phone 8.
    Voici mon code:

    HttpClient client = new HttpClient();
    client.Timeout = new TimeSpan(0, 5, 0);
    StreamContent content = new StreamContent(ImageStream);
    client.DefaultRequestHeaders.Add("user-agent", "Windows Phone 8");
    content.Headers.Add("Content-Length", ImageStream.Length.ToString());
    content.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
    HttpResponseMessage response = await client.PostAsync(App.MediaUrl + "/PostMedia?keyFromPhone=" + Key + "&comment=" + Comment, content);
    if (response.IsSuccessStatusCode)
    {
    //Do some work
    }
    L'image stream est le stream résultant d'une cameraCaptureSequence

    Mon soucis est lors de la récupération de la réponse de mon serveur.
    Mon serveur enregistre l'image envoyée, crée des miniatures et met à jour ma base de données. Il renvoie une réponse sous forme json comportant un code différent si il y a eu une erreur ou non.
    Mon serveur est un IIS 7.5 en VM sur Azure
    Quand je teste en local, je reçois bien la réponse de mon serveur. Quand je suis en production, cela dépend du temps d'upload.
    Si j'ai une bonne connexion ou que l'image est petite, je reçois ma réponse.
    Si par contre j'ai une connexion lente, la réponse que je reçois coté client (windows phone) est une réponse vide avec un code d'erreur, Serveur Not Found. Coté serveur l'image est pourtant bien sauvegardée, ainsi que les miniatures et ma base de données est mise à jour. 
    Quand j'utilise fiddler, il semblerait que mon windows phone récupère la réponse avant que le serveur n'ait fini le traitement. Mais je finis bien par récupérer la réponse complète sur fiddler.

    Une idée? Un timeout quelque part? 

    Merci d'avance!

    • Type modifié Aurel Bera vendredi 6 décembre 2013 07:56 disc
    jeudi 28 novembre 2013 15:09

Toutes les réponses

  • Bonjour

    Avez-vous essaye de modifier les Timeouts dans l'app.config?

    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name=".............." 
                         closeTimeout="00:01:00" 
                         openTimeout="00:01:00"
                         receiveTimeout="00:10:00" 
                         sendTimeout="00:01:00" 
                 

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    vendredi 29 novembre 2013 08:39
  • Bonjour

    Avez-vous des nouvelles pour nous?

    Merci!

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 2 décembre 2013 09:07
  • Bonjour,

    Je suis en serveur REST. J'ai ajouté dans mon web.config <httpRuntime targetFramework="4.5" maxRequestLength="102400" executionTimeout="3600" />

    Je n'ai aucun soucis pour uploader des images lourdes depuis mon interface web avec un formulaire en Javascript. Avec la récupération des données avec un HttpPostedFile côté serveur.

    Par contre côté Windows Phone, je récupère toujours une réponse null au bout d'une minute. Coté serveur, je récupère directement le stream passé dans le content de la requête.

    Je reconfirme que l'image est quand même bien uploadée malgré la réponse null reçue coté windows phone.

    Cordialement,

    Maëlle Delay

    lundi 2 décembre 2013 15:43
  • Il y a une exception ou seulement la réponse avec null?
    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 3 décembre 2013 08:14
  • Je récupère une erreur 404 Serveur Not Found.
    mardi 3 décembre 2013 08:53
  • Avec maxRequestLength="102400" vous limitez la taille de la requête a 100 Kb.
    Est que vous utilisez des images avec une taille plus grande?

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 3 décembre 2013 09:38
  • Sauf erreur de ma part, maxRequestLength="102400" limite les requêtes à 100 MB.

    Cf la documentation msdn http://msdn.microsoft.com/fr-fr/library/e1f13641(v=vs.85).aspx

    maxRequestLength

    Attribut Int32 facultatif.

    Spécifie la limite du seuil de mise en mémoire tampon du flux d'entrée, en Ko. Cette limite peut contribuer à empêcher des attaques par déni de service, provoquées, par exemple, par la publication de fichiers volumineux par les utilisateurs sur le serveur.

    La valeur par défaut est 4096 (4 Mo).


    Cordialement,

    Maëlle Delay

    mardi 3 décembre 2013 17:58
  • C'est vrai.
    J'ai pensée à une autre chose. Désolée.
    La soucie dans ce cas est que   <httpRuntime targetFramework="4.5" maxRequestLength="102400" executionTimeout="3600" /> s'applique au serveur.
    A priori le serveur se comporte bien car l'image c'est enregistrée. Je dirais qu'on doit changer de cote client.
    Pouvez-vous nous montrer la config cote client du votre service ?

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mercredi 4 décembre 2013 07:41
  • Je suis en REST donc pas de configuration spéciale coté windows phone. Je n'ai strictement rien ajouté dans l'App.xaml ou l'AppManifest. Par contre il me semble que j'ai oublié de préciser que je ne développais que pour Windows Phone 8.

    En discutant avec des développeurs Windows Phone, j'ai entendu parler d'un timeout forcé coté Windows Phone... Cela peut-il venir de la ? Et peut-on le modifier?

    Cordialement,

    Maëlle Delay

    mercredi 4 décembre 2013 10:27
  • Si vous effectuez un appel de service web par le biais de httpwebrequest (mais ne pas en ajoutant des références web), vous pouvez définir la propriété de délai d'expiration:

    http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.timeout.aspx


    Cordialement,

    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.


    • Modifié Aurel Bera mercredi 4 décembre 2013 10:43
    mercredi 4 décembre 2013 10:43
  • J'avais déjà testé la classe HttpWebRequest mais la propriété de timeout n'est pas accessible dans l’implémentation pour Windows Phone.

    Je n'ai par contre pas compris ce que vous vouliez dire à propos des références web. Pouvez vous m'expliquer?


    Cordialement,

    Maëlle Delay

    mercredi 4 décembre 2013 13:52
  • C'est service REST donc pas de référence. Apres re-re-revoir ce thread si possible permettez le trace sur le service Web pour avoir un plus de détails sur l’erreur:

    http://msdn.microsoft.com/fr-fr/library/ms733025.aspx

    Essayez aussi de modifier serviceTimeouts:

    http://msdn.microsoft.com/en-us/library/ms789017(v=vs.110).aspx

    Et pouvez-vous nous montrer la config seveur ?


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mercredi 4 décembre 2013 14:50