2

クライアントに送信するサーバー側のオブジェクト型にクラス オブジェクトを格納しました。クライアント側で Object 型からクラス オブジェクトのデータ メンバーのデータを取得するにはどうすればよいですか? 通信にはWCFを使用しています。私はこの概念に慣れていません。

Service Contract

  [ServiceContract]
  public interface IRCommService
  {
    [OperationContract]
    result sendMessage(string command, object data);
  }

  [DataContract]
  public class result
  {
    [DataMember]
    public List<string> results { get; set; }
  }


[service behavior]
 public result sendMessage(string command, object data)
    {
      List<string> l = new List<string>();
      Console.WriteLine("Received");
      return new result { results = l };
    }
4

2 に答える 2

1

オブジェクト データ型を使用する代わりに、カスタム リクエスト オブジェクトを使用することをお勧めします。そのリクエスト オブジェクト クラスは、クライアントとサーバーの両方で共通である必要があります。クライアント側では、リクエストを入力して、サーバーから必要な結果を取得するだけです。

ソリューション階層は次のようにすることをお勧めします。

ここに画像の説明を入力

namespace ServerProj
{
    using System.ServiceModel;
    using Common;

    [ServiceContract]
    public interface IRCommService
    {
        [OperationContract]
        Result SendMessage(string command, CustomRequest data);
    }
}

namespace ServerProj
{
    using System.Collections.Generic;
    using Common;

    public class RCommService : IRCommService
    {
        public Result SendMessage(string command, CustomRequest data)
        {   // You can get the value from here
            int value = data.MyValue;

            Result result = new Result();
            List<string> list = new List<string>();
            list.Add("Sample");
            result.Rsults = list;

            return result;
        }
    }
}

Common アセンブリの要求クラス

namespace Common
{
    using System.Runtime.Serialization;

    [DataContract]
    public class CustomRequest
    {
        [DataMember]
        public int MyValue { get; set; }
    }
}

Common アセンブリの応答クラス

namespace Common
{
    using System.Collections.Generic;
    using System.Runtime.Serialization;

    [DataContract]
    public class Result
    {
        [DataMember]
        public List<string> Rsults { get; set; }
    }
}

次に、クライアント側でサービス参照として追加します。

private void button1_Click(object sender, EventArgs e)
        {
            ServiceReference1.RCommServiceClient service = new ServiceReference1.RCommServiceClient();
            CustomRequest customRequest=new CustomRequest();
            customRequest.MyValue = 10;

            Result result = service.SendMessage("Test", customRequest);
        }
于 2013-11-10T08:12:40.697 に答える
1

本当に柔軟性が必要な場合は、辞書の使用を検討してください。そうは言っても、1 つのサービス メソッドで 10 の異なる入力を処理するよりも、異なる署名を持つ 10 のサービス メソッドを使用する方がおそらく優れています。

また、カスタム クラスを渡すことも一般的な方法です。したがって、オブジェクトに 10 個の異なるものがある場合は、10 個のプロパティを持つクラスを作成し、必要なものを設定するだけです。

于 2013-11-10T05:15:53.837 に答える