locked
[WebMethod]属性のついたメソッドの戻り値について RRS feed

  • 質問

  • お世話になります。mkmarimoと申します。

    最近Silverlightを勉強し始めたものです。

    以下のページを参考にWebサービス(asmx)を利用したSilverlightアプリを
    作ろうとチャレンジしていますが、途中で躓いてしまいました。

    http://codezine.jp/article/detail/3596

    ASP.NETプロジェクトでWebサービスを追加したときにできた
    [WebMethod]属性のついているメソッドの戻り値を自作したクラスにしています。

    この自作クラスは「Silverlight クラスライブラリ」として作成し、
    Silverlightプロジェクト、ASP.NETプロジェクトの双方で使えるよう参照に追加しました。

    そしてSilverlight側のプロジェクトでWebサービスを呼び出して、
    終了時イベントハンドラで戻り値を取得(XXXXEventArgs.Result)しようとしたところ、
    異なる名前空間のクラスが返ってきてしまい、思い通りに動きません。
    ※object型でもCommunicationExceptionがスローされてしまいます。
      string型なら問題なく動きます。

    [WebMethod]属性のついているメソッドの戻り値に
    自作クラスを使ってはいけないのでしょうか。

    もしくは自作クラスを戻り値とする場合は何かやらなければいけない
    ルールのようなものがあるのでしょうか。

    ソースの掲載がなく申し訳ないんですが、よろしくお願いします。
    2009年4月17日 7:49

回答

  • public をつけ忘れている、とか、そういうことはないでしょうか。たとえば、このような感じで定義・利用できます。

    サービス側
    namespace SilverlightApplication1.Web
    {
        public class MyResult
        {
            public int num { get; set; }
            public string text { get; set; }
        }

        (略)
        public class MyService : System.Web.Services.WebService
        {
            [WebMethod]
            public MyResult GetMyResult()
            {
                return new MyResult { num = 123, text = "Hello" };
            }
        }
    }

    利用する側
            private void btn_Click(object sender, RoutedEventArgs e)
            {
                ServiceReference1.MyServiceSoapClient s = new SilverlightApplication3.ServiceReference1.MyServiceSoapClient();
                s.GetMyResultCompleted += new EventHandler<SilverlightApplication3.ServiceReference1.GetMyResultCompletedEventArgs>(s_GetMyResultCompleted);
                s.GetMyResultAsync();
            }

            void s_GetMyResultCompleted(object sender, SilverlightApplication3.ServiceReference1.GetMyResultCompletedEventArgs e)
            {
                myText1.Text = e.Result.text;
                myText2.Text = e.Result.num.ToString();
            }

    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。


    マイクロソフト株式会社 デベロッパー&プラットフォーム統括本部 IT技術者アドバンス テクノロジー本部 デベロッパーエバンジェリズムグループ
    • 回答としてマーク mkmarimo 2009年4月18日 8:16
    2009年4月17日 9:45

すべての返信

  • public をつけ忘れている、とか、そういうことはないでしょうか。たとえば、このような感じで定義・利用できます。

    サービス側
    namespace SilverlightApplication1.Web
    {
        public class MyResult
        {
            public int num { get; set; }
            public string text { get; set; }
        }

        (略)
        public class MyService : System.Web.Services.WebService
        {
            [WebMethod]
            public MyResult GetMyResult()
            {
                return new MyResult { num = 123, text = "Hello" };
            }
        }
    }

    利用する側
            private void btn_Click(object sender, RoutedEventArgs e)
            {
                ServiceReference1.MyServiceSoapClient s = new SilverlightApplication3.ServiceReference1.MyServiceSoapClient();
                s.GetMyResultCompleted += new EventHandler<SilverlightApplication3.ServiceReference1.GetMyResultCompletedEventArgs>(s_GetMyResultCompleted);
                s.GetMyResultAsync();
            }

            void s_GetMyResultCompleted(object sender, SilverlightApplication3.ServiceReference1.GetMyResultCompletedEventArgs e)
            {
                myText1.Text = e.Result.text;
                myText2.Text = e.Result.num.ToString();
            }

    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。


    マイクロソフト株式会社 デベロッパー&プラットフォーム統括本部 IT技術者アドバンス テクノロジー本部 デベロッパーエバンジェリズムグループ
    • 回答としてマーク mkmarimo 2009年4月18日 8:16
    2009年4月17日 9:45
  •         void s_GetMyResultCompleted(object sender, SilverlightApplication3.ServiceReference1.GetMyResultCompletedEventArgs e)
            {
                myText1.Text = e.Result.text;
                myText2.Text = e.Result.num.ToString();
            }

    大野様

    ご回答ありがとうございます。mkmarimoです。

    まさに上記ソースのイベントハンドラで躓いているんですが、私の環境では
    e.Resultの型がServiceReference1.MyResultになってしまいます。

    ご回答くださったサンプルコードではMyResultクラスをサービス側にのみ定義していますが、
    利用する側でMyResultクラスを認識するにはSilverlightApplication1.Webをusingする
    ということでしょうか?

    私はMyResultに当たるクラスを「Silverlight クラスライブラリ」として
    DLLモジュールにし、各プロジェクトで参照させました。
    これがマズイのでしょうか。

    自分で試せばいいんですが、現在手元に開発環境がなく、月曜までに解決したい
    ということより申し訳ないですが、また質問させていただきました。

    以上、よろしくお願いします。


    2009年4月17日 12:34
  • 大野様

    お世話になります。mkmarimoです。

    結局気になったので、開発環境を構築し、試してみました。


    まさに上記ソースのイベントハンドラで躓いているんですが、私の環境では
    e.Resultの型がServiceReference1.MyResultになってしまいます。

    上記の部分ですが、そのまま使えばよかったんですね。

    わざわざ、自作クラスを別モジュールとして作成し、
    Silverlight、ASP.NETの両プロジェクトで参照したのが間違いのようでした。

    初歩的な質問でしたが、私にとってはひとつ勉強になりました。

    これにて質問を締め切らさせていただきます。

    ありがとうございました。

    2009年4月18日 8:15