WCF:如何在客户端创建对象作为消息的参数

时间:2012-10-12 07:08:07

标签: wcf message

我有使用原始邮件的WCF服务(Message class)。

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);

这里有什么问题?我在服务端有Person类(数据契约),它放在TestService名称空间中:TestService.Person。在服务方面一切都很好。但是在我使用VS2008中的“添加服务引用...”选项向客户端添加服务引用之后,客户端就没有这样的类型(TestService.Person)。我做了什么来解决这个问题?我只是在客户端复制了带有原始数据契约(TestService.Person)的文件,创建了Person类型的对象并将其传递给服务方法。

我的问题是 - 我是以正确的方式做到了还是有另一种方法可以做到这一点?

提前谢谢。

戈兰

1 个答案:

答案 0 :(得分:1)

由于Person类未在任何服务合同中公开,因此不会通过服务元数据共享其信息。这就是你在客户端遇到错误的原因。如果您使用相同的命名空间将类复制到客户端。

然而,更好的解决方案是将Person类放在另一个程序集中,并从客户端引用此程序集。