14

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

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 に答える