IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP.NET MVC Discussion :

C#, Android, MVC et Erreur "Java.Net.HttpStatus.BadMethod"


Sujet :

ASP.NET MVC

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre chevronn�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2005
    Messages
    482
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : D�cembre 2005
    Messages : 482
    Par d�faut C#, Android, MVC et Erreur "Java.Net.HttpStatus.BadMethod"
    Salut,
    J'ai cr�� un simple controller MVC nomm� "ProgrammesController" contenant une m�thode Get() me permettant de r�cup�rer un datatable (qui fonctionne bien).
    Pour y acc�der je tape directement dans mon explorateur : "http://MonServeur/Updator_Service/api/Programmes/" (cela fonctionne)

    j'ai ensuite cr�� une m�thode Get(string id) permettant de renvoyer un datatable ne contenant que les donn�es concern�es par cet "id".
    Pour y acc�der : "http://MonServeur/Updator_Service/api/Programmes/truc" o� "truc" est l'id � envoyer pour filtrer le datatable. (dans l'explorateur cela fonctionne)

    voici le code de ce controller :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;
    using System.Web;
    using System.Data;
     
    namespace Updator.Controllers
    {
        public class ProgrammesController : ApiController
        {
            public System.Data.DataTable Get(string id)
            {
                DataTable dt_Programmes = null;
                DataTable dt_Logiciels = null;
                Outils_BDD.Objets.Connexion_BDD_Collection mesConnexions = null;
     
                Commun.logue("Tentative de récupération des programmes pour la tablette '" + id + "'", "ProgrammesController.RecupProgrammes", "Updator", null);
     
                try
                {
                    mesConnexions = new Outils_BDD.Objets.Connexion_BDD_Collection(HttpContext.Current.Server.MapPath(@"~/Parametres/Connexions.xml"), true);
                }
                catch (Exception ex)
                {
                    Commun.logue("Erreur lors de la connexion à la base 'Applications'", "ProgrammesController.RecupProgrammes", "Updator", ex);
                    return null;
                }
     
                try
                {
                    dt_Programmes = new DataTable("Programmes");
     
                    string requete = "SELECT * FROM Recup_Android_Programmes_Tablettes_V ORDER BY NumSerie, Nom";
                    Outils_BDD.Utiles.RecupCharge_Table(dt_Programmes, requete, HttpContext.Current.Server.MapPath(@"~/Parametres/Programmes.xml"), mesConnexions["Applications"], true, false);
     
                    DataRow[] drs_Programmes = dt_Programmes.Select("NumSerie = '" + id + "'");
                    dt_Logiciels = dt_Programmes.Clone();
                    foreach (DataRow dr_Programme in drs_Programmes)
                    {
                        dt_Logiciels.ImportRow(dr_Programme);
                    }
                }
                catch (Exception ex)
                {
                    Commun.logue("Erreur lors de la récupération des Programmes", "ProgrammesController.Get", "Updator", ex);
                    return null;
                }
     
                return dt_Logiciels;
            }
     
            public System.Data.DataTable Get()
            {
                DataTable dt_Programmes = null;
                Outils_BDD.Objets.Connexion_BDD_Collection mesConnexions = null;
     
                Commun.logue("Tentative de récupération des programmes", "ProgrammesController.Get", "Updator", null);
     
                try
                {
                    mesConnexions = new Outils_BDD.Objets.Connexion_BDD_Collection(HttpContext.Current.Server.MapPath(@"~/Parametres/Connexions.xml"), true);
                }
                catch (Exception ex)
                {
                    Commun.logue("Erreur lors de la connexion à la base 'Applications'", "ProgrammesController.Get", "Updator", ex);
                    return null;
                }
     
                try
                {
                    dt_Programmes = new DataTable("Programmes");
     
                    string requete = "SELECT * FROM Recup_Android_Programmes_Tablettes_V ORDER BY NumSerie, Nom";
                    Outils_BDD.Utiles.RecupCharge_Table(dt_Programmes, requete, HttpContext.Current.Server.MapPath(@"~/Parametres/Programmes.xml"), mesConnexions["Applications"], true, false);
                }
                catch (Exception ex)
                {
                    Commun.logue("Erreur lors de la récupération des Programmes", "ProgrammesController.Get", "Updator", ex);
                    return null;
                }
     
                return dt_Programmes;
            }
        }
    }
    Donc, dans l'explorateur les deux fonctionnent, j'ai ensuite cr�� (sous android/xamarin) deux bouts de code pour r�cup�rer les donn�es de ce service web.
    Le premier n'ayant qu'� interroger le service web :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    public static DataTable Recup_DataTable_ServiceWeb(string URL_ServiceWeb)
            {
                DataTable retour = null;
                System.IO.Stream maIS;
     
                try
                {
                    HttpURLConnection urlConnection = null;
                    URL url;
                    url = new URL(URL_ServiceWeb);
                    urlConnection = (HttpURLConnection)url.OpenConnection();
                    urlConnection.SetRequestProperty("Content-Type", "application/xml");
                    urlConnection.Connect();
     
                    maIS = urlConnection.InputStream;
     
                    retour = new DataTable();
                    retour.ReadXml(maIS);
                }
                catch (Exception ex)
                {
                    throw new Exception("Erreur avec le service web '" + URL_ServiceWeb + "' : " + ex.Message);
                }
     
                return retour;
            }
    appel� comme ceci : Outils_Android_Reseau.Service_Web.Recup_DataTable_ServiceWeb("http://MonServeur/Updator_Service/api/Programmes");
    Ce code fonctionne parfaitement, je r�cup�re bien mon dataset au complet dans mon programme Android.

    Le deuxi�me par contre me pose probl�me; Voici le bout de code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    public static DataTable Recup_DataTable_ServiceWeb(string filtre, string URL_ServiceWeb)
            {
                DataTable retour = null;
                HttpURLConnection urlConnection = null;
     
                try//Envoi Post
                {                
                    URL url = new URL(URL_ServiceWeb);
                    urlConnection = (HttpURLConnection)url.OpenConnection();
                    urlConnection.RequestMethod = "POST";
                    urlConnection.SetRequestProperty("Content-Type", "application/xml");
                    //urlConnection.SetRequestProperty("Content-Type", "text/xml; charset=utf-8");
     
                    urlConnection.DoInput = true;
                    urlConnection.DoOutput = true;
     
                    Stream os = urlConnection.OutputStream;
                    PrintWriter pw = new PrintWriter(os);
                    pw.Print(filtre);
                    pw.Close();
                }
                catch (Exception ex)
                {
                    throw new Exception("Erreur Lors de l'envoi : " + ex.Message);
                }
     
                try//Reception reponse
                {
                    HttpStatus status = urlConnection.ResponseCode;
     
                    if (status != HttpStatus.Ok)
                    {
                        retour = null;
                    }
                    else
                    {
                        retour = new DataTable();
                        retour.ReadXml(urlConnection.InputStream);
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception("Erreur Lors de la réception de la réponse : " + ex.Message);
                }
     
                return retour;
            }
    pour l'ex�cuter : Outils_Android_Reseau.Service_Web.Recup_DataTable_ServiceWeb(_numSerie, "http://MonServeur/Updator_Service/api/Programmes");

    Quand je l'ex�cute, "urlConnection.ResponseCode" me renvoie syst�matiquement "Java.Net.HttpStatus.BadMethod"

    Je tourne en rond depuis plusieurs heures et malgr� les exemples similaires sur le web je ne trouve pas l'origine de mon probl�me
    J'ai tendance � penser que le service web est correct vu que via Firefox j'obtiens bien dans les deux cas un XML repr�sentant mon datatable.
    Et au vu des exemples trouv� sur le web, je ne vois pas ce que j'ai pu louper dans le code cot� Android.

    Je ne suis ni un pro d'Android (Seulement 2 programmes assez simples � mon actif) ni d'ASP.Net en g�n�ral (quelques petits projets simples seulement)

    Quelqu'un peut'il m'�clairer ?

    Merci

  2. #2
    Mod�rateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    F�vrier 2010
    Messages
    3 611
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activit� : CTO
    Secteur : Finance

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par d�faut
    Dans ta fonction Outils_Android_Reseau.Service_Web.Recup_DataTable_ServiceWeb, es-tu sur que ton service Web attend un POST et non un GET ?
    Less Is More
    Pensez � utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre chevronn�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2005
    Messages
    482
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : D�cembre 2005
    Messages : 482
    Par d�faut
    Salut et merci pour ton int�r�t,
    J'avoue que c'est une notion qui m'�chappe un peu, pour moi un 'Get' c'est pour recevoir et un 'Post' c'est pour envoyer; alors quand j'envoie une valeur pour en recevoir une autre je suis un peu paum� :p

    Dans tous les cas, j'ai fait varier la ligne "urlConnection.RequestMethod = "GET";" en 'Get', en 'Post' et en rien du tout et le r�sultat est toujours le m�me : 'BadMethod'

    J'ai l'impression que c'est la mani�re d'envoyer la variable (write dans l'outputstream) qui ne fait pas ce que je veux, car, quand je regarde les logs au niveau du service web, je ne vois aucune tentative d'interrogation de ce service :
    "Commun.logue("Tentative de r�cup�ration des programmes pour la tablette '" + id + "'", "ProgrammesController.RecupProgrammes", "Updator", null);"
    Alors que quand je l'interroge manuellement depuis Firefox j'obtiens bien mon dataset/Xml et le log est bien cr�� sur le serveur.

  4. #4
    Expert confirm�

    Avatar de Fran�ois DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activit� : Consultant informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par d�faut
    Bonjour,

    Je pr�cise que je ne connais pas le dev sous Android, donc je me contente de mettre en �vidence les diff�rences que j'ai pu observer entre le code qui marche et celui qui ne marche pas :
    • un utilise urlConnection.InputStream, l'autre urlConnection.OutputStream ;
    • celui qui fonctionne appelle urlConnection.Connect(), l'autre non ;
    • � quoi correspondent les DoInput ? DoOutput ?

  5. #5
    Membre chevronn�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    D�cembre 2005
    Messages
    482
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 44

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : D�cembre 2005
    Messages : 482
    Par d�faut
    Bonjour Fran�ois,
    Le probl�me est que les deux fonctions ne font pas la m�me chose :
    La premi�re ne fait que R�cup�rer une donn�e d'o� le fait que je ne reste qu'en GET et que je r�cup�re l'inputsream renvoy�e
    La deuxi�me POST une information puis GET la r�ponse, d'o� l'utilisation dans un premier temps du outputstream pour envoyer ma variable puis du inputstream pour r�cup�rer la r�ponse.

    Pour l'utilisation du DoOutput j'ai trouv� cette r�ponse :
    You need to set it to true if you want to send (output) a request body, for example with POST or PUT requests. With GET, you do not usually send a body, so you do not need it.
    mais de toute mani�re je pense avoir essay� toutes les combinaisons possibles (oui, quand je ne trouve vraiment pas je teste tout ce que je peux 'au pif' :p )

    Pour le Connect() j'ai tent� aussi de le placer un peu partout sans succ�s.

    Je pr�cise que ce bout de code "Recup_DataTable_ServiceWeb(string filtre, string URL_ServiceWeb)" est le fruit de plusieurs exemples diff�rents mais concordants trouv�s sur le web.
    Certains �taient pour Android (mais en Java), certains sur le site de Xamarin, donc en c# mais ne faisant soit que poster soit que r�cup�rer des donn�es.
    Je n'arrive donc pas � trouver d'exemple pour mon probl�me pr�cis soit : en Xamarin (donc framework Java mais en c#), en POSTant une variable et en 'GETtant' la r�ponse.

  6. #6
    Expert confirm�

    Avatar de Fran�ois DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activit� : Consultant informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par d�faut
    On comprends d�j� mieux ce qui doit �tre fait.

    Une suggestion alors, car l'erreur indique une m�thode a priori non support�e (par exemple, l'appel � une m�thode POST alors que seul le GET est autoris�).

    Essayer de pr�ciser au niveau des m�thodes du contr�leur les VERB qui sont accept�es en utilisant un attribut comme [/c][AcceptVerbs(WebRequestMethods.Http.Get, WebRequestMethods.Http.Post)][/c].

    L'usage de HttpGet et HttpPost est possible mais uniquement pour les m�thodes n'acceptant qu'un seul verbe (or l�, a priori, il doit y en avoir deux). Quand il y en a plusieurs, il faut utiliser AcceptVerbs.

Discussions similaires

  1. erreur out java.net.ConnectException: Connection refused: connect
    Par saadtv4004 dans le forum Services Web
    R�ponses: 3
    Dernier message: 08/03/2011, 16h30
  2. R�ponses: 0
    Dernier message: 21/02/2011, 11h25
  3. Erreur de compilation java.net.MalformedURLException
    Par karimspace dans le forum Services Web
    R�ponses: 4
    Dernier message: 12/04/2007, 11h34
  4. Erreur java.net. ConnectException:
    Par kenny49 dans le forum Entr�e/Sortie
    R�ponses: 2
    Dernier message: 27/02/2007, 10h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo