gpt4 book ai didi

c# - WCF 服务出现未知类型错误

转载 作者:太空宇宙 更新时间:2023-11-03 21:32:56 26 4
gpt4 key购买 nike

我正在尝试在 WCF 客户端上使用此方法:

public interface IOhmioService
{
[OperationContract]
IEnumerable<Enumerador> GetEnumerador(Type type);
}

public class OhmioService : IOhmioService
{
public IEnumerable<Enumerador> GetEnumerador(Type type)
{
var _obj = (IEnumerador)Activator.CreateInstance(type);
return _obj.Enumerar();
}
}

并像这样实现:

public IEnumerable<Enumerador> GetEnumerador(Type type)
{
dynamic _obj = Activator.CreateInstance(type);
return (IEnumerable<Enumerador>)_obj.Enumerar();
}

由于未知类型,它给我错误,但我不明白为什么。服务器和客户端都知道返回类型。我只是想告诉客户端要创建哪种对象。我敢肯定,如果我将 Type 参数作为字符串传递,并使用 select case,它将正常工作。还有另一种方法可以在 WCF 服务上执行泛型方法吗?谢谢!

更新

这是我得到的错误:

Type 'System.RuntimeType' wasn't spected with the contract name RuntimeType:http://schemas.datacontract.org/2004/07/System'. Trye to use DataContractResolver or add the unknown types staticaly to the list of known types (for instance, using the attribute KnownTypeAttribute or adding them to the list of known types to pass to DataContractSerializer)

最佳答案

Generics are not supported by WCF .

话虽如此,我假设您正在将 Type 的子类传递给 GetEnumerador。问题在于,尽管您的服务知道 Type 类型的参数,因此隐式为其创建了一个 DataContract,但它不知道任何其他类。这使得序列化失败。

为了修复它,您需要明确显示子类。您有多种选择

  • 通过实现 DataContractResolver 自定义序列化
  • 使用ServiceKnownTypes注释你的契约(Contract),它提供了两个选项:
    1. 使用多个ServiceKnownTypes 注释静态声明子类,每个子类一个
    2. 指定将动态调用以获取类型的方法

编辑 1:如果您确定要序列化 ​​Type 对象,请查看 this other question其中显示了常见问题的解决方案。

编辑 2(OP 更新后):

该错误表明您正在将 System.RuntimeType 对象传递给 GetEnumerador。实际上,鉴于 System.Type 是一个抽象,GetEnumerador 将始终接收它的子类。

正如我之前所说,WCF 只知道 Type,这是您在契约(Contract)中指定的,因此它会产生错误,因为它不知道如何序列化 System.RuntimeType。我首先列举的选项仍然适用。例如,你可以试试这个:

[ServiceKnownType(typeof(System.RuntimeType))]
public interface IOhmioService
{
[OperationContract]
IEnumerable<Enumerador> GetEnumerador(Type type);
}

如果您确定 GetEnumerador 将始终收到 System.RuntimeType,您可以这样做:

public interface IOhmioService
{
[OperationContract]
IEnumerable<Enumerador> GetEnumerador(RuntimeType type);
}

总而言之,我建议不要序列化 ​​Type,但如果出于某种原因您觉得必须这样做,请查看 the linked question .

关于c# - WCF 服务出现未知类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23369841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com