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

Я новичок в мире веб-сервисов, так что терпите меня. Я создаю очень простой веб-сервис в 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;
        }   
    }
}

Когда я вызываю это и ввожу значение «John Smith» для параметра str, он возвращает:

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

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


person Baxter    schedule 20.08.2012    source источник
comment
IMO, лучший дизайн - объявить класс в вашем WSDL и вернуть его экземпляр. Таким образом, этот метод может быть вызван любой другой структурой, поскольку тип обмена является общедоступным, а не зависящим от платформы.   -  person Andre Calil    schedule 20.08.2012
comment
Я бы не запнулся из-за того, что это веб-сервис или нет. Просто верните обратно тот тип данных, который вам нужен.   -  person Menefee    schedule 20.08.2012
comment
@AndreCalil Не могли бы вы указать мне на справочник / учебник, который предоставляет дополнительную информацию об объявлении класса в моем WSDL?   -  person Baxter    schedule 20.08.2012
comment
@Baxter Дай мне 1 минуту   -  person Andre Calil    schedule 20.08.2012
comment
@Baxter Готово, взгляни на мой ответ   -  person Andre Calil    schedule 20.08.2012
comment
@Baxter Не могли бы вы высказать свое мнение о моем ответе? Это то, что вы искали?   -  person Andre Calil    schedule 20.08.2012
comment
@AndreCalil Я ценю отзывы, но не верю, что это то, что я ищу. Я не собираюсь принимать сложный вложенный тип C #. Я ищу лучшие практики того, как возвращать более одного значения одного и того же типа, а также как делать разные типы из метода веб-службы. Я буду использовать SOAP для запроса / ответа.   -  person Baxter    schedule 21.08.2012
comment
@Baxter Посмотрите новый пример, который я добавил к своему ответу. С Уважением.   -  person Andre Calil    schedule 22.08.2012


Ответы (1)


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

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

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

Дайте мне знать, если вам понадобится дополнительная поддержка.


ОБНОВЛЕНИЕ

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

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

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

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();
person Andre Calil    schedule 20.08.2012
comment
@AndreCalil Я скопировал и развернул этот код в Visual Studio. Когда я запускаю его в браузере, он показывает мне правильный запрос / ответ мыла для SOAP 1.1 и SOAP 1.2, и когда я нажимаю кнопку вызова, он возвращает ответ, указанный выше. - person Baxter; 22.08.2012
comment
@AndreCalil Большое спасибо за отличное объяснение. - person Baxter; 22.08.2012
comment
@AndreCalil привет андре. отличный ответ. что я могу сделать, если хочу вернуть несколько объектов Student? например, после опроса всех учеников в возрасте 6 лет, каков правильный рабочий процесс? большое спасибо - person David Gidony; 06.07.2015
comment
@DavidGidony Привет! Вы видите, как у студента есть список курсов? Это была бы та же идея, вы бы создали тип - например, Result - который имел бы List<Student>. - person Andre Calil; 06.07.2015
comment
@AndreCalil, привет, я так и сделал, но когда я возвращаю тип списка в качестве ответа, я не получаю никаких данных. - person David Gidony; 07.07.2015
comment
@DavidGidony Привет, Дэвид, не могли бы вы опубликовать свой код в качестве нового вопроса и связать его здесь? Так будет легче помочь. - person Andre Calil; 08.07.2015