2011-04-27 82 views
1

是否可以声明一个基本已知类型并允许传输所有派生类型?C#WCF抽象?

[ServiceContract] 
public interface IService 
{ 
    [OperationContract] 
    [ServiceKnownType(typeof(BaseMsg))] 
    object[] Do(BaseMsg msg); 
} 

这样做可以不用声明IService接口中每个派生类型的属性?

回答

1
直接

没有,但如果你不介意创建非标准服务,可能只能被另一个.NET应用程序使用,那么可以使用KnownTypesAttribute使用this constructor

这可以让你创建一个webservice,它有方法,动态地告诉它它有什么类型可用于transmision。然后,您可以使用反射来反映加载程序集中的所有类型,这些类型派生自您的类型并添加它们。但是这必须在服务器和客户端上完成,这样他们才能相互理解。

3

不,这是不可能的。所有派生类型都需要在WSDL中公开,因此明确指定。如果你不想修改源代码并重新编译Web服务,你可以使用<declaredTypes>元素在web.config中达到同样的目标:

<system.runtime.serialization> 
    <dataContractSerializer> 
     <declaredTypes> 
      <add type="AppName.BaseType, AppName"> 
       <knownType type="AppName.KnownType, AppName" /> 
      </add> 
     </declaredTypes> 
    </dataContractSerializer> 
</system.runtime.serialization> 
+0

+1:当我忘记服务层是通过WCF时,我总是遇到这种情况。这和服务合同中缺少通用功能的确有时候会让我感到不安。 – Brook 2011-04-27 14:54:46