我有一个WCF方法,它接受一个自定义类的参数,比如说,
void MyWCFMethod(MyCustomClass MethodArgument)
在上面,MyCustomClass有许多构造函数重载。该服务具有对类的引用,但不引用客户端。我想允许客户端使用其他重载,但默认构造函数是唯一似乎允许的构造函数。有没有办法做到这一点?
答案 0 :(得分:0)
我猜 - 不!
据我所知,MyCustomClass是数据契约,并由[DataContract]属性标记。 因此,WCF运行时将使用DataContractSerializer(默认情况下)将接收到的消息中的数据反序列化为对象实例。
那么DataContractSerializer在哪里可以为您的特定构造函数获取其他参数? 数据协定实例必须具有要实例化的公共无参数构造函数。 但也许您可以编写自己的序列化程序(但请记住,DataContractSerializer不能继承)...并为构造函数提供额外的数据。但是,如果您可以在某处获取该信息,只需在数据协定的公共无参数构造函数中执行此操作。
所以我猜你做错了什么。尝试指定在您的案例中在构造函数中传递数据的目标是什么。也许您的应用可以使用其他解决方案。
答案 1 :(得分:0)
您当然可以这样做,但我认为了解数据传输对象(DTO)为什么不通过服务引用公开逻辑非常重要。
用于生成客户端代理以访问WCF服务的WSDL \ XSD元数据仅通过公开的操作和交换的数据类型来描述Web服务。
具体来说,XSD只描述了DTO的结构而不是逻辑 - 这就是客户端代理上只有默认构造函数和公共属性/字段的原因。
因此,解决方案是将客户端和服务之间的所有自定义类交换到一个单独的共享库中。这样,线路的两端都可以访问通过WSDL \ XSD无法获得的附加逻辑(如参数化构造函数)。