2012-10-12 25 views
1

我有使用原始消息(消息類)的WCF服務。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名稱空間中的Person類(數據契約):TestService.Person。在服務方面一切都很好。但在VS2008中使用「添加服務引用...」選項向客戶端添加服務引用後,客戶端沒有這種類型(TestService.Person)。我做了什麼來解決這個問題?我只是在客戶端複製了帶有原始數據契約(TestService.Person)的文件,創建了Person類型的對象並將其傳遞給服務方法。

我的問題是 - 我以正確的方式做,還是有另一種方式來做到這一點?

預先感謝您。

戈蘭

+0

爲什麼不讓您的服務方法接受Person參數? –

+0

因爲我們使用更通用的消息類型作爲參數。這是要求。 – tesicg

回答

1

因爲Person類不關你的服務合同暴露自己的信息不是通過服務元數據共享。這就是爲什麼你在客戶端發生錯誤。如果您將這些類複製到您的客戶端,並使用相同的命名空間。

但是,更好的解決方案是將Person類放在另一個程序集中,並從客戶端引用此程序集。

+0

是的,有一個錯誤,我知道這是因爲原來的Person類沒有通過服務元數據公開。這就是我將原始文件複製到客戶端的原因。而且我也在考慮按照你的建議將Person類放在單獨的程序集中,並將其引用到兩個項目中,但我不確定它是否正確,因爲迄今爲止我沒有使用原始消息。非常感謝你。 – tesicg

+0

@tesicg你好。祝你好運。 –

相關問題