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

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

这是我正在使用的代码:

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参数输入值“John Smith”时,它返回:

  Hello John Smith 

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

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

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

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

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


UPDATE

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

  • 学生的姓名
  • 学生的出生日期
  • 学生当前分配到的课程列表(以其姓名表示)

看看服务的签名方式:

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

调用之后,结果如下:

  Baxter 1986-04-22T00:00:00   SOAP Webservices 101   Mastering C#   Why you (and I) suck at Javascript    

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

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