【问题标题】:Returning generic object with generic dictionary from WCF service从 WCF 服务返回具有通用字典的通用对象
【发布时间】:2012-11-15 16:36:36
【问题描述】:

我有一个 WCF 服务,方法如下:

[OperationContract]
TernaryWebServiceResponse<long> ModifyObservations(...);

响应对象如下:

[DataContract]
public class TernaryWebServiceResponse<T>
{
    [DataMember]
    public TernaryProcessingResultStatus ProcessingSuccessStatus { get; set; }

    [DataMember]
    public Dictionary<T, bool> ProcessingSuccessDetails { get; set; } 
}

此类在共享程序集中定义,并且 WCF 引用配置为重用它。

但是当我生成代理时,我会得到这样的结果:

自定义工具警告:无法导入 wsdl:portType 详细信息:异常 在运行 WSDL 导入扩展时抛出: System.ServiceModel.Description.DataContractSerializerMessageContractImporter 错误:引用类型“TernaryWebServiceResponse”1,常规, Version=1.0.0.0,Culture=neutral,PublicKeyToken=null' 带数据 命名空间中的合同名称“TernaryWebServiceResponseOflong” 'http://schemas.datacontract.org/2004/Genaral.SoapCommunication' 无法使用,因为它与导入的 DataContract 不匹配。需要 从引用类型中排除此类型。

谁能解释一下,这里到底是什么问题?我知道泛型可以在 WCF 合同中使用,只要它们得到解决,例如不是MyObj&lt;T&gt;,而是MyObj&lt;long&gt;。那么这门课有什么问题呢?是不是在类上定义的 T 不能在字典上以某种方式解析?

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    也许定义一份新合同会有所帮助。 类似的东西:

    [DataContract] 
    public class LongTernaryWebServiceResponse : TernaryWebServiceResponse<long> 
    { 
    }
    

    然后在您的服务合同中类似:

    [OperationContract]
    LongTernaryWebServiceResponse ModifyObservations(...);
    

    【讨论】:

    • 我将其标记为答案,因为我最终实际上使用了它,尽管它没有解释为什么会发生这种情况。问题实际上在于字典序列化。在某些情况下,编写一个可序列化的字典包装器 (stackoverflow.com/questions/1124597/…) 会起作用,以防 smb else 遇到这个问题。
    【解决方案2】:

    如果类的泛型类型只需要 Dictionary 键,您也许可以按照这个(未经测试)的方式做一些事情......

    [DataContract]
    public class TernaryWebServiceResponse
    {
    
        [DataMember]
        public TernaryProcessingResultStatus ProcessingSuccessStatus { get; set; }
    
        [DataMember]
        private Dictionary<object, bool> mProcessingSuccessDetails;
    
        static public TernaryWebServiceResponse Create<T>(Dictionary<T, bool> list)
        {
            var dc = new TernaryWebServiceResponse();
            dc.mProcessingSuccessDetails = new Dictionary<object, bool>();
            foreach (var pair in list)
            {
                dc.mProcessingSuccessDetails.Add((object)pair.Key, pair.Value);
            }
            return dc;
        }
    
        public Dictionary<T, bool> ProcessingSuccessDetails<T>()
        {
            return mProcessingSuccessDetails.ToDictionary(x => ((T)x.Key), x => x.Value);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-26
      • 2010-11-29
      相关资源
      最近更新 更多