WCF服务上的未知类型错误

时间:2014-04-29 16:07:45

标签: c# wcf

我试图在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参数作为字符串传递给例如并使用选择案例,它将正常工作。 是否有另一种方法在WCF服务上执行泛型方法?谢谢!

更新

这是我得到的错误:

  

键入&#39; System.RuntimeType&#39;没有使用合同名称RuntimeType:http://schemas.datacontract.org/2004/07/System&#39;来指定。尝试使用DataContractResolver或将未知类型staticaly添加到已知类型列表中(例如,使用属性KnownTypeAttribute或将它们添加到已传递给DataContractSerializer的已知类型列表中)

1 个答案:

答案 0 :(得分:4)

Generics are not supported by WCF

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

为了解决这个问题,你需要明确地创建子类。你有几个选择

  • 通过实施DataContractResolver
  • 来自定义序列化
  • 使用ServiceKnownTypes为您的合同添加注释,提供两种选择:
    1. 使用多个ServiceKnownTypes注释静态声明子类,每个子类一个
    2. 指定将动态调用以获取类型的方法

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

编辑2(OP更新后)

该错误表示您将System.RuntimeType对象传递给GetEnumerador。实际上,假设System.Type是抽象的,GetEnumerador将始终接收它的子类。

正如我之前所说,WCF只知道Type这是你在合同中指定的内容,因此它会产生错误,因为它不知道如何序列化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