none
WCF - parametre optionnel RRS feed

  • Question

  • Bonjour,

    Je rencontre actuellement une erreur avec une methode de mon service WCF.

    méthode avec parametre optionnel

    Côté Interface

       [OperationContract, XmlSerializerFormat(Style = OperationFormatStyle.Document)]
       [WebGet]
      [FaultContract(typeof(OperationFailed))]

       int get_data(int myId = 0);

    Après avoir compilé et publié, j'effectue une test avec l'application SOAPUI. Lorsque aucun paramètre n'est passé à la fonction j'ai une erreur :

    Le serveur n'a pas pu traiter la demande en raison d'une erreur interne. Pour plus d'informations sur l'erreur, activez IncludeExceptionDetailInFaults

    Lorsque je met  dans mon fichier de config <serviceDebug includeExceptionDetailInFaults="true"/>

    j'ai l'erreur :

    Erreur lors de la désérialisation du corps du message.........

    Le format de la chaîne d'entrée est incorrect.

    Quelqu'un peut me mettre sur la piste .

    Merci,

    jeudi 14 novembre 2013 14:19

Réponses

  • Bonjour,

    Les types nullables ne sont nativement pas supportés par WCF pour les services orientés RESTful. Deplus l'attribut [Optional] n'a pas d'utilités dans WCF.

    Savez-vous comment rendre un paramètre optionnel et lui donneer une valeur par défaut si celle -ci n'est pas renseignée lors de l'appel de la méthode?

    private static int ParseInt32Argument(string value, int defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
    
        int id;
        if (Int32.TryParse(value, out id) == false)
        {
            throw new WebFaultException(HttpStatusCode.BadRequest);
        }
    
        return id;
    }
    
    [OperationContract, XmlSerializerFormat(Style = OperationFormatStyle.Document)]
    [WebGet(UriTemplate = "get_data?MyId={myid}")]
    public int get_data(string MyId)
    {
        int id;
        id = ParseInt32Argument(MyId, 0);
    
        return id;
    }

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    • Marqué comme réponse GraySky lundi 18 novembre 2013 10:27
    dimanche 17 novembre 2013 16:38
    Modérateur

Toutes les réponses

  • Bonjour,

    Corrigez votre méthode comme ceci :

    [OperationContract, XmlSerializerFormat(Style = OperationFormatStyle.Document)]
    [WebGet(UriTemplate="get_data?myId={myid}]
    [FaultContract(typeof(OperationFailed))]
    int get_data(string myId);

    A vous de contrôler le paramètre myId si il est valide et de déclencher si nécessaire une belle erreur HTTP...

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    jeudi 14 novembre 2013 23:43
    Modérateur
  • Bonjour,

    J'ai effectué quelques tests, mais je ne suis pas arrivé à ce que je souhaite. Toujours une erreur lors de l'appel de méthode sans paramètre.

    Je souhaite avoir une paramètre optionnel, avec une valeur par défaut.


            [OperationContract, XmlSerializerFormat(Style = OperationFormatStyle.Document)]
            [WebGet(UriTemplate = "get_data?MyId={myid}")]
            [FaultContract(typeof(OperationFailed))]
            int get_data([Optional]int? MyId);

    ou cette écriture avec par défaut : 0

      int get_data(int? MyId = 0);

    Mais dans les 2 cas  lorsque je fais un appel de méthode get_data sans passer de paramètre j'ai une erreur.

    Savez-vous comment rendre un paramètre optionnel et lui donneer une valeur par défaut si celle -ci n'est pas renseignée lors de l'appel de la méthode?

    Merci,

    vendredi 15 novembre 2013 09:29
  • Bonjour,

    Les types nullables ne sont nativement pas supportés par WCF pour les services orientés RESTful. Deplus l'attribut [Optional] n'a pas d'utilités dans WCF.

    Savez-vous comment rendre un paramètre optionnel et lui donneer une valeur par défaut si celle -ci n'est pas renseignée lors de l'appel de la méthode?

    private static int ParseInt32Argument(string value, int defaultValue)
    {
        if (value == null)
        {
            return defaultValue;
        }
    
        int id;
        if (Int32.TryParse(value, out id) == false)
        {
            throw new WebFaultException(HttpStatusCode.BadRequest);
        }
    
        return id;
    }
    
    [OperationContract, XmlSerializerFormat(Style = OperationFormatStyle.Document)]
    [WebGet(UriTemplate = "get_data?MyId={myid}")]
    public int get_data(string MyId)
    {
        int id;
        id = ParseInt32Argument(MyId, 0);
    
        return id;
    }

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    • Marqué comme réponse GraySky lundi 18 novembre 2013 10:27
    dimanche 17 novembre 2013 16:38
    Modérateur