14

我对网络服务世界很陌生,所以请多多包涵。我正在使用 .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”时:

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

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

4

1 回答 1

37

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

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

请检查这个问题:How to Declare Complex Nested C# Type for Web Service 它确实显示了一些代码和一个小建议。

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


更新

假设您要为给定的 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<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();
于 2012-08-20T13:53:46.993 回答