我有一个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 错误:引用的类型&#39; TernaryWebServiceResponse`1,General, Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null&#39;有数据 合同名称&#39; TernaryWebServiceResponseOflong&#39;在命名空间 &#39; HTTP://schemas.datacontract.org/2004/Genaral.SoapCommunication' 无法使用,因为它与导入的DataContract不匹配。需要 从引用的类型中排除此类型。
有人可以解释一下,这究竟是什么问题?我知道只要解决了泛型,就可以在WCF合同中使用泛型,例如不是MyObj<T>
而是MyObj<long>
。那么这堂课有什么不对?是否在类上定义的T不能以某种方式在字典上解析?
答案 0 :(得分:0)
也许定义新合同会有所帮助。 类似的东西:
[DataContract]
public class LongTernaryWebServiceResponse : TernaryWebServiceResponse<long>
{
}
然后在您的服务合同中,例如:
[OperationContract]
LongTernaryWebServiceResponse ModifyObservations(...);
答案 1 :(得分: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);
}
}