web-dev-qa-db-fra.com

Comment renvoyer plusieurs valeurs depuis un webservice?

Je suis très nouveau dans le monde des services Web, alors soyez indulgents avec moi. Je crée un service Web très simple dans Visual Studio 2010 à l'aide de fichiers .asmx.

Voici le code que j'utilise:

namespace MyWebService
{
    [WebService(Namespace = "http://www.somedomain.com/webservices")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]

    public class Service1 : System.Web.Services.WebService
    {
        [WebMethod]
        public string simpleMethod(String str)
        {
            return "Hello " + str;
        }   
    }
}

Lorsque j'invoque ceci et que j'entre une valeur "John Smith" pour le paramètre str qu'il renvoie:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://www.somedomain.com/webservices">Hello John Smith</string>

Ma question est quelle est la meilleure pratique pour renvoyer plus d'une valeur pour une méthode de service Web? Si les valeurs sont toutes du même type de données, dois-je utiliser un tableau? Si les valeurs contiennent différents types de données, aurais-je besoin de créer une classe personnalisée?

14
Baxter

Je crois que la meilleure conception est de écrire une classe et de l'inclure sur votre WSDL . Cela rendra la signature de classe disponible avec la description de votre service. Cela signifie qu'un client, malgré sa langue, pourra utiliser un objet de ce type.

Lors de la création de cette classe, essayez de ne pas utiliser les types personnalisés intégrés .Net , comme DataSet ou autre. Essayez de toujours utiliser des types de base chaque fois que possible. Cela garantira que votre objet sera facilement sérialisé et désérialisé, ainsi que utilisé par les clients développés par des frameworks autres que .Net.

Veuillez vérifier cette question: Comment déclarer un type C # complexe imbriqué pour un service Web Il affiche également un petit code et un petit conseil.

Faites-moi savoir si vous avez besoin d'une assistance supplémentaire.


[~ # ~] mise à jour [~ # ~]

Supposons que vous souhaitiez renvoyer, pour une méthode Web donnée, l'ensemble de données suivant:

  • Nom de l'étudiant
  • Date de naissance de l'élève
  • Une liste des cours auxquels l'étudiant est actuellement affecté (représentés par leurs noms)

Regardez comment le service serait signé:

public class WebService1 : System.Web.Services.WebService
{
    public class Course
    {
        public string Name { get; set; }
    }

    public class Student
    {
        public string Name { get; set; }
        public DateTime BirthDate { get; set; }
        public List<Course> CurrentCourses { get; set; }
    }

    [WebMethod]
    public Student HelloWorld()
    {
        Student Baxter = new Student();

        Baxter.Name = "Baxter";
        Baxter.BirthDate = new DateTime(1986, 04, 22);
        Baxter.CurrentCourses = new List<Course>();
        Baxter.CurrentCourses.Add(new Course() { Name = "SOAP Webservices 101" });
        Baxter.CurrentCourses.Add(new Course() { Name = "Mastering C#" });
        Baxter.CurrentCourses.Add(new Course() { Name = "Why you (and I) suck at Javascript" });

        return Baxter;
    }
}

Après l'avoir appelé, voici le résultat:

<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">
    <Name>Baxter</Name>
    <BirthDate>1986-04-22T00:00:00</BirthDate>
    <CurrentCourses>
        <Course>
            <Name>SOAP Webservices 101</Name>
        </Course>
        <Course>
            <Name>Mastering C#</Name>
        </Course>
        <Course>
            <Name>Why you (and I) suck at Javascript</Name>
        </Course>
    </CurrentCourses>
</Student>

Et le mieux est que, comme cette signature de classe est publique (incluse dans le WSDL), vous pouvez faire ce qui suit dans un projet différent , en traitant simplement le WSDL:

        ServiceReference1.WebService1SoapClient SoapClient = new ServiceReference1.WebService1SoapClient();
        ServiceReference1.Student IsThisBaxter = SoapClient.HelloWorld();
37
Andre Calil