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

WCF:如何在客户端创建对象作为消息的参数,wcf,message,Wcf,Message,我有使用原始消息(消息类)的WCF服务 1) 服务方: [DataContract] public class Person { [DataMember] public int Id { get; set; } [DataMember] public string FirstName { get; set; } [DataMember] public string LastName { get; set; } } [ServiceContra

我有使用原始消息(消息类)的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);
}
这里有什么问题?我在服务端有Person类(数据契约),它位于TestService命名空间中:TestService.Person。服务方面一切正常。但在我使用VS2008中的“AddServiceReference…”选项向客户端添加了服务引用之后,客户端上就没有这样的类型(TestService.Person)。我做了什么来解决这个问题?我只是在客户端复制了带有原始数据约定(TestService.Person)的文件,创建了Person类型的对象并将其传递给服务方法

我的问题是——我是以正确的方式做的,还是有其他的方式做的

先谢谢你


Goran

因为
Person
类未在您的任何服务合同中公开,所以它们的信息不会通过服务元数据共享。这就是为什么客户端会出现错误。如果您使用相同的命名空间将类复制到您的客户机上


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

因为
Person
类未在您的任何服务合同中公开,它们的信息未通过服务元数据共享。这就是为什么客户端会出现错误。如果您使用相同的命名空间将类复制到您的客户机上


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

为什么不让服务方法接受Person参数?因为我们使用更通用的消息类型作为参数。这就是要求。为什么不让您的服务方法接受Person参数呢?因为我们使用更通用的消息类型作为参数。这是要求。是的,有一个错误,我知道这是因为原始Person类没有通过服务元数据公开。这就是我将原始文件复制到客户端的原因。我还想按照您的建议将Person类放在单独的程序集中,并将其引用到两个项目中,但我不确定这是否正确,因为到目前为止我还没有处理原始消息。非常感谢您。@tesick您很高兴。祝您好运。是的,出现了一个错误,我知道这是因为原始Person类没有通过服务元数据公开。这就是我将原始文件复制到客户端的原因。我还想按照您的建议将Person类放在单独的程序集中,并将其引用到两个项目中,但我不确定这是否正确,因为到目前为止我还没有处理原始消息。非常感谢您。@tesick您很高兴。祝你好运
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);