是否可以声明基本已知类型并允许传输所有派生类型?
[ServiceContract]
public interface IService
{
[OperationContract]
[ServiceKnownType(typeof(BaseMsg))]
object[] Do(BaseMsg msg);
}
这可以在不使用属性声明IService接口中的每个派生类型的情况下完成吗?
答案 0 :(得分:3)
不,这是不可能的。所有派生类型都需要在WSDL中公开,因此明确指定。如果您不想修改源代码并重新编译Web服务,可以使用web.config中的<declaredTypes>
元素来实现相同的目标:
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="AppName.BaseType, AppName">
<knownType type="AppName.KnownType, AppName" />
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
答案 1 :(得分:1)
不直接,但如果您不介意创建非标准服务,那可能只能被其他.NET应用程序使用,那么您可以使用KnownTypesAttribute使用this constructor。
这允许您创建一个具有方法的web服务,动态地告诉它可用于传输的类型。然后,您可以使用反射来反映加载的程序集中的所有类型,这些类型派生自您的类型并添加它们。但这必须在服务器和客户端上完成,以便彼此了解。