Подтвердить что ты не робот

Как вернуть несколько значений из веб-службы?

Я очень новичок в мире веб-сервисов, поэтому, пожалуйста, несите меня. Я создаю очень простой веб-сервис в Visual Studio 2010 с использованием .asmx файлов.

Вот код, который я использую:

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;
        }   
    }
}

Когда я вызываю это и вводим значение "Джон Смит" для возвращаемого параметра str:

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

Мой вопрос в том, что является лучшей практикой для возврата более 1 значения для метода веб-службы? Если значения имеют одинаковый тип данных, я должен использовать массив? Если значения содержат разные типы данных, мне нужно создать пользовательский класс?

4b9b3361

Ответ 1

Я считаю, что лучший дизайн - написать класс и включить его в WSDL. Это сделает подпись класса доступной вместе с описанием вашей службы. Это означает, что клиент, несмотря на его язык, сможет использовать объект такого типа.

При создании этого класса старайтесь не использовать .Net встроенные пользовательские типы, например DataSet или anyother. По возможности всегда используйте базовые типы. Это гарантирует, что ваш объект будет легко сериализован и десериализован, а также будет использоваться клиентами, разработанными в других средах, кроме .Net.

Пожалуйста, проверьте этот вопрос: Как объявить сложный вложенный тип С# для веб-службы Он также показывает небольшой код и небольшой совет.

Сообщите мне, нужна ли вам дополнительная поддержка.


UPDATE

Скажем, что вы хотите вернуть для данного веб-метода следующий набор данных:

  • Имя студента
  • Дата рождения ученика
  • Список курсов, которым назначен текущий ученик (представленный их именами)

Посмотрите, как будет подписана служба:

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;
    }
}

После его вызова это результат:

<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>

И самое лучшее, потому что эта подпись класса является общедоступной (включена в WSDL), вы можете сделать следующее в другом проекте, просто обработав WSDL:

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