1

生のメッセージ (メッセージ クラス) を使用する WCF サービスがあります。

1) サービス側:

[DataContract]
public class Person
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string FirstName { get; set; }

    [DataMember]
    public string LastName { get; set; }
}

[ServiceContract]
public interface ITestService
{
    [OperationContract(Action = TestService.RequestAction3)]
    void AddNewPerson(Message newPerson);

public void AddNewPerson(Message newPerson)
{
    Person personToAdd = newPerson.GetBody<Person>();
    Employees.Persons.Add(personToAdd);
}

2) クライアント側:

TestServiceClient client = new TestServiceClient();

String RequestAction3 = "http://localhost:4249/Message_RequestAction3";
TestService.Person person = new TestService.Person
{
    Id = 6,
    FirstName = "Aleksey",
    LastName = "Alekseyev"
};

Message request3 = Message.CreateMessage(MessageVersion.Default, RequestAction3, person);
string soapRequest = request3.ToString();
client.AddNewPerson(request3);

ここで何が問題なのですか?TestService 名前空間: TestService.Person に配置されるサービス側に Person クラス (データ コントラクト) があります。サービス面ではすべて問題ありません。しかし、VS2008で「サービス参照の追加...」オプションを使用してクライアント側にサービス参照を追加した後、クライアント側にそのようなタイプ(TestService.Person)はありません。この問題を解決するために何をしましたか? クライアント側で元のデータ コントラクト (TestService.Person) を含むファイルをコピーし、Person 型のオブジェクトを作成してサービス メソッドに渡しました。

私の質問は - 私は正しい方法でそれをやったのですか、それともこれを行う別の方法がありますか?

前もって感謝します。

ゴラン

4

1 に答える 1

1

Personクラスはどのサービス コントラクトにも公開されていないため、それらの情報はサービス メタデータを介して共有されません。そのため、クライアント側でエラーが発生します。クラスを同じ名前空間でクライアントにコピーすると、それで済みます。

ただし、別のアセンブリに Person クラスを配置し、クライアントからこのアセンブリを参照することをお勧めします。

于 2012-10-12T07:26:22.030 に答える