2014-12-29 47 views
-2

我试图将复杂类型的一个参数发送到WCF操作,但是当我尝试使用它时,操作的签名变得不同并且被转换为多个简单参数类型。将单个复杂类型参数传递给wcf操作问题

如何在服务器中声明客户端的签名?

例如,我的WCF的样子:

[MessageContract] 
public class Foo 
{ 
    [MessageBodyMember] 
    public int ID {get; set;} 

    [MessageBodyMember] 
    public DateTiem Birthdate {get; set;} 

    [MessageBodyMember] 
    public string Name {get; set;} 
} 

[ServiceContract] 
public interface IMyService 
{ 

    [OperationContract] 
    string Get(Foo request); 
} 

public class MyService 
{ 
    public string Get(Foo request) 
    { 
     // My Code 
    } 
} 

和克林特侧面看上去就像是:

MySvc.MyServiceClient c = new MySvc.MyServiceClient(); 

// The following code does not work 
MySvc.Foo req = new MySvc.Foo(); 
req.Id = 5; 
req.Birthdate = DateTiem.Now; 
req.Name = "John"; 
c.Get(req); 

//I should pass the parameters like the following since the signature here be different 
c.Get(5, DateTime.Now, "John"); 
+0

为什么使用MessageContract和MessageBodyMember代替DataContract和DataMember? – empi

+0

将消费服务的克林特征求了这一点。根据他的需求,他需要自己的自定义格式的SOAP消息。 – Ibrahim

回答

0

有多种解决方案。

最好的做法是将您的合同(数据和服务)对象编译成一个通用的客户端程序集,并在客户端和服务器端使用相同的程序集(因此根本不需要创建服务引用)。

根本不使用消息契约也是很好的,只有简单的数据契约。在客户端添加服务引用时,这些通常看起来就像服务器端一样。最后,如果你坚持消息契约(你不应该,恕我直言),你可以要求Visual Studio在添加服务引用(应该有一个复选框)时在客户端生成消息契约。

+0

谢谢。不幸的是消费者使用不同的开发环境但是最后的建议是完美的,当我添加引用时,您是对的,我必须单击“高级”按钮,然后选中“始终生成消息协定”复选框。 – Ibrahim

相关问题