我认为最好的设计方法是编写一个类并在您的WSDL上包含它。这将使该类的签名与您服务的描述一起可用。这意味着,客户端无论使用哪种语言,都能够使用该类型的对象。
创建这个类时,请尽量不要使用.NET内置的自定义类型,如DataSet或任何其他类型。尽可能使用基本类型,这将确保您的对象易于序列化和反序列化,并且可以被开发框架不同于.NET的客户端使用。
请查看此问题:
How to Declare Complex Nested C# Type for Web Service。它展示了一些代码和小小的建议。
如果您需要进一步的支持,请让我知道。
更新:
假设您想要返回给定Web方法的以下一组数据:
- 学生姓名
- 学生出生日期
- 学生当前分配的课程列表(由其名称表示)
看看服务的签名应该是怎样的:
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();