如何从Web服务返回多个值?

时间:2020-12-26 02:01:27

I am very new to the world of web services so please bear with me. I am creating a very simple web service in Visual Studio 2010 using .asmx files.

我对Web服务世界很陌生,所以请耐心等待。我正在使用.asmx文件在Visual Studio 2010中创建一个非常简单的Web服务。

Here is the code I am using:

这是我正在使用的代码:

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

When I invoke this and enter a value "John Smith" for the the str parameter it returns:

当我调用它并为str参数输入值“John Smith”时,它返回:

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

My question is what is the best practice for returning more than 1 value for a web service method? If the values are all the same data type should I use an array? If the the values contain different data types would I need to create a custom class?

我的问题是,为Web服务方法返回超过1个值的最佳做法是什么?如果值都是相同的数据类型,我应该使用数组吗?如果值包含不同的数据类型,我需要创建自定义类吗?

1 个解决方案

#1


35  

I believe that the best design is to write a class and include it on your WSDL. This will make the class signature available along with the description of your service. This means that a client, despite of it's language, will be able to use an object of that type.

我相信最好的设计是编写一个类并将其包含在您的WSDL中。这将使类签名与您的服务描述一起提供。这意味着客户端,尽管它的语言,将能够使用该类型的对象。

When creating this class, try not to use .Net built-in custom types, like DataSet or anyother. Try always using basic types whenever possible. This will ensure that your object will be easily serialized and deserialized, as well as used by clients developed frameworks other than .Net.

创建此类时,尽量不要使用.Net内置自定义类型,如DataSet或任何其他类型。尽可能尝试使用基本类型。这将确保您的对象可以轻松地序列化和反序列化,以及客户开发的除.Net之外的框架使用。

Please, check this question: How to Declare Complex Nested C# Type for Web Service It does show a little code and a small advice as well.

请检查以下问题:如何为Web服务声明复杂的嵌套C#类型它确实显示了一些代码和一些小建议。

Let me know if you need any further support.

如果您需要任何进一步的支持,请告诉我。


UPDATE

UPDATE

Let's say that you want to return, for a given webmethod, the following set of data:

假设您想要为给定的webmethod返回以下数据集:

  • Student's name
  • 学生的名字
  • Student's birth date
  • 学生的出生日期
  • A list of the courses that the student is current assigned to (represented by their names)
  • 学生当前分配到的课程列表(以其姓名表示)

Look at how the service would be signed:

看看服务的签名方式:

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

After calling it, this is the result:

调用之后,结果如下:

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

And the best is that, because this class signature is public (included in the WSDL), you can do the following at a different project, by simply processing the WSDL:

最好的是,因为此类签名是公共的(包含在WSDL中),所以您可以通过简单地处理WSDL在不同的项目中执行以下操作:

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

#1


35  

I believe that the best design is to write a class and include it on your WSDL. This will make the class signature available along with the description of your service. This means that a client, despite of it's language, will be able to use an object of that type.

我相信最好的设计是编写一个类并将其包含在您的WSDL中。这将使类签名与您的服务描述一起提供。这意味着客户端,尽管它的语言,将能够使用该类型的对象。

When creating this class, try not to use .Net built-in custom types, like DataSet or anyother. Try always using basic types whenever possible. This will ensure that your object will be easily serialized and deserialized, as well as used by clients developed frameworks other than .Net.

创建此类时,尽量不要使用.Net内置自定义类型,如DataSet或任何其他类型。尽可能尝试使用基本类型。这将确保您的对象可以轻松地序列化和反序列化,以及客户开发的除.Net之外的框架使用。

Please, check this question: How to Declare Complex Nested C# Type for Web Service It does show a little code and a small advice as well.

请检查以下问题:如何为Web服务声明复杂的嵌套C#类型它确实显示了一些代码和一些小建议。

Let me know if you need any further support.

如果您需要任何进一步的支持,请告诉我。


UPDATE

UPDATE

Let's say that you want to return, for a given webmethod, the following set of data:

假设您想要为给定的webmethod返回以下数据集:

  • Student's name
  • 学生的名字
  • Student's birth date
  • 学生的出生日期
  • A list of the courses that the student is current assigned to (represented by their names)
  • 学生当前分配到的课程列表(以其姓名表示)

Look at how the service would be signed:

看看服务的签名方式:

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

After calling it, this is the result:

调用之后,结果如下:

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

And the best is that, because this class signature is public (included in the WSDL), you can do the following at a different project, by simply processing the WSDL:

最好的是,因为此类签名是公共的(包含在WSDL中),所以您可以通过简单地处理WSDL在不同的项目中执行以下操作:

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