WCF&亚音速类 - 反序列化器没有任何类型的知识可以映射到此合同

时间:2013-09-26 08:12:36

标签: asp.net wcf subsonic wcf-binding

我的WCF客户端出现以下错误:

"Error in line 1 position 1910. Element 'http://schemas.datacontract.org/2004/07/SubSonic:_currentValue' contains data of the 'http://schemas.datacontract.org/2004/07/System:DBNull' data contract. The deserializer has no knowledge of any type that maps to this contract. Add the type corresponding to 'DBNull' to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding it to the list of known types passed to DataContractSerializer."

我使用Subsonic 2.0来生成我的类对象。

我还使用DataContractDataMember装饰了我的班级和成员。

尝试将[KnownType(typeof(System.DBNull))]添加到Generated类中。

尝试将[ServiceKnownType(typeof(System.DBNull))]添加到我的服务界面。

我生成的类如下所示:(此类是为SQL View生成的)

/// <summary>
    /// This is  Read-only wrapper class for the  view.
    /// </summary>
    [Serializable]    
    [KnownType(typeof(System.DBNull))]
    [DataContract]
    public partial class VwPatientRt : ReadOnlyRecord<VwPatientRt> 
    { ... ...

服务接口:

 [ServiceContract]    
    [ServiceKnownType(typeof(System.DBNull))]    
    public interface IPatientService
    {
        [WebInvoke(Method = "GET", UriTemplate = "GetPatientAppointments")]
        [OperationContract]
        IList<VwPatientRt> GetPatientAppointments();
     ..... 

服务类:

public class PatientService : IPatientService
{ 
    public IList<VwPatientRt> GetPatientAppointments()
    {
       ... .
       .....
    }
   ... 

在客户端,一切似乎都可以。因为对于其他方法和类,它工作正常。

在查看详细异常时,在Subsonic TableColumnSetting类中使用DBNull和_currentValue。

我该怎么办?

也用谷歌搜索并经历了类似的帖子,但没有人帮助过我,并且在这2天之后就已经挣扎了。

我们非常感谢您提供有关代码段的任何帮助或建议。

:解决:

我的WCF服务是使用框架4.5构建的,我的使用客户端是使用框架3.5构建的。由于此Add Service Reference向导未生成使用

声明的KnownTypes的Class属性
[ServiceKnownType(typeof(System.DBNull))] 

因此,当反序列化客户端没有获得System.DBNull类型时。我们必须在客户端配置文件中添加已知类型。

客户端需要此配置解决了我的问题:

<system.runtime.serialization>
        <dataContractSerializer>    
            <declaredTypes>
                <add type="NameSpace.ServiceClientName.ClassNameForWhichKnownTypeIsToBeGiven, AssemblyName">
                    <knownType  type="System.DBNull"></knownType>
                </add>
             </declaredTypes>
        </dataContractSerializer>
</system.runtime.serialization> 

希望这对某人有用。

0 个答案:

没有答案