web-dev-qa-db-ja.com

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」という値を入力すると、次のように返されます。

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

私の質問は、Webサービスメソッドに対して複数の値を返すためのベストプラクティスは何ですか?値がすべて同じデータ型の場合、配列を使用する必要がありますか?値に異なるデータ型が含まれている場合、カスタムクラスを作成する必要がありますか?

14
Baxter

最良の設計は、クラスを記述して、WSDLに含めることであると思います。これにより、サービスの説明とともにクラス署名が利用可能になります。これは、言語に関係なく、クライアントはそのタイプのオブジェクトを使用できることを意味します。

このクラスを作成する場合、DataSetなどの.Net組み込みのカスタムタイプを使用しないようにしてください。可能な限り、常に基本タイプを使用してください。これにより、オブジェクトが簡単にシリアル化および逆シリアル化され、.Net以外のクライアントが開発したフレームワークでも使用できるようになります。

この質問を確認してください: Webサービスの複雑なネストされたC#タイプを宣言する方法 小さなコードと小さなアドバイスも表示されます。

さらにサポートが必要な場合はお知らせください。


[〜#〜]更新[〜#〜]

特定の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();
37
Andre Calil