1

我有一个使用以下方法的 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,常规,版本 = 1.0.0.0,文化 = 中性,无法使用命名空间“http://schemas.datacontract.org/2004/Genaral.SoapCommunication”中数据合同名称为“TernaryWebServiceResponseOflong”的 PublicKeyToken=null',因为它与导入的 DataContract 不匹配。需要从引用类型中排除此类型。

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

4

2 回答 2

0

也许定义一份新合同会有所帮助。就像是:

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

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

[OperationContract]
LongTernaryWebServiceResponse ModifyObservations(...);
于 2012-11-15T16:43:57.520 回答
0

如果只需要 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);
    }

}
于 2012-11-15T17:22:08.850 回答