2009-08-20 40 views
1

假设我有一个WCF服务,并在合同的方法在wcf上使用泛型字典:我需要寻找什么?

<ServiceContract()> _ 
Interface IThingService 
'... 
    <OperationContract()> _ 
    Function GetThing(thingId As Guid) As Thing 
End Interface 

其中事情是与普通特性的普通类,除了一个成员:

Public Class Thing 
    ' ... 
    Public Property Photos() As Dictionary(Of String, Photo) 
    ' ... 
End Class 

其中照片是用普通的类普通的属性。

所以我跳入为this MSDN article,并this blog post一些文档,例如,现在我很困惑,如果我要了解很多有关的DataContractSerializer和服务如何序列化照片属性的细节。

我是否需要去那里,或者我可以做些什么让服务器上的WCF自动与我的客户端交互?在我看来,所有的序列化细节应该可以被抽象出来 - 我只是想结束了,在消费客户机应用程序,具有:

Dim foo as Thing = ThingServiceClient.GetThing(someGuid) 
Dim myPhotos as Dictionary(Of String, Photo) = foo.Photos 

什么我需要在我的事的定义做做这个工作?我需要在其他地方做些什么才能使其发挥作用?我是否需要担心确保服务粘贴到DataContractSerializer,并且不会退回到使用XmlSerializer?

+0

哦,顺便说一句,这个问题从这个较早的问题中流出来:http://stackoverflow.com/questions/1294269/getting-bad-generated-code-from-update-service-reference – 2009-08-20 11:39:00

+0

虽然没有回答这个,但我们已经放弃了这种方法,因为无关的设计原因,所以我不再需要答案 - 虽然我想知道... – 2009-09-11 17:40:12

回答

0

您需要确保您使用[DataContract]属性来修饰“物品”,并且您希望包含在数据合同中的所有成员必须具有[DataMember]属性。你的“Photo”类也是一样。

只要你不必处理多态(继承)和/或自定义集合,那应该是真的。剩下的部分应该由WCF运行时为您负责。

马克

+0

我没有任何我的类的DataContract属性,只要我添加它,我得到一个例外如下。任何想法我做错了什么? {“接收到对localhost/MyService/MyService.svc/...的HTTP响应时发生错误,这可能是由于服务端点绑定不使用HTTP协议造成的,也可能是由于HTTP请求上下文被服务器(可能由于服务关闭)。请参阅服务器日志以获取更多详细信息。“} – 2009-08-20 16:58:44

+0

您使用的是什么绑定?服务器日志告诉你什么? – 2009-08-20 17:17:25

+0

basicHttpBinding,并且服务器日志中没有任何内容。 – 2009-08-20 17:23:54

1

我会小心直接公开您的WCF合同(或ASMX web服务,或任何其他外部入口点进入系统)业务对象。这是外部系统使用的接口,即使您的业务对象在内部发生更改,此接口也应该保持不变。在服务器上也可以有对业务对象有意义的功能,但不在客户端上。

此外,您突然需要修改您的商务对象,以便它符合您选择的通信技术,例如,你必须在商业课上添加属性,这些属性与商务课程无关。

我将创建一个包含要传输到客户端的数据并使用Thing实例中的数据初始化的ThingDTO(DTO =数据传输对象)。这意味着如果你认为你的WCF服务是系统的门面,那么ThingDTO就是你门面层的一部分。因此,控制WCF序列化的属性可以在这里自由进行。

这就是说,它是不一样的,它对你的情况是有意义的。这只是我关于从WCF界面返回业务类的一般看法。

+0

我同意,但我也希望能回答我的问题。没人知道? – 2011-07-20 02:39:46

1

我差点让自己试图解决这个问题。最后,我还活着,并且有一小段代码。享受它:)

[DataContract, Serializable] 
[KnownType("GetKnownTypes")] 
public class Dto 
{ 
    [DataMember] 
    public Int PropertyA { get; set; } 

    [DataMember] 
    public String PropertyB { get; set; } 

    [DataMember] 
    public Dictionary<string, object> MyDictionary { get; set; } 

    private static Type[] GetKnownTypes() 
    { 
     return _myDictionaryValueTypes ?? new Type[] { Typeof(Dictionary<string, object>) }; 
    } 

    private void MyDictionaryValueTypes() 
    { 
     if (XmlDictionary == null) return; 
     _myDictionaryValueTypes = XmlDictionary.Values.Where(value => value != null).Select(value => value.GetType()).ToArray(); 
    } 
} 

唯一需要确保的是调用MyDictionaryValueTypes,就是这样。

相关问题