Joh*_*ski 3 c# asp.net wcf proxy-classes return-value
根据我关于WCF 服务返回值的另一篇文章,我正在使用另一家公司的 Web 服务,当我在 Visual Studio 中添加服务引用时,该方法的返回值是类型为 的对象object
。
Web 服务的作者向我展示了代码,它实际上返回了一个类型化的对象。
我是否遗漏了某些内容,或者代理类是否应该返回键入的值?
是否有用于生成代理类或实际服务的设置?
更新:
我查看了 WCF 服务背后的实际类,并意识到服务方法的返回值实际上是返回具体类型实现的接口。具体类型用 [DataContract] 属性(和适当的 [DataMember] 属性)标记,但接口没有这样的属性。这是否会导致服务将返回类型设置为对象?
假设,如果您是服务开发人员,您可以使用KnownTypeAttribute
:
[DataContract]
[KnownType(typeof(MyConcreteClass))]
public interface IMyInterface {
}
[DataContract]
public class MyConcreteClass : IMyInterface {
}
Run Code Online (Sandbox Code Playgroud)
我个人没有用接口尝试过这个,但我用抽象基类尝试过,它工作得很好。当客户端收到返回值后,就可以成功向下转型为派生类。
可能服务代码实际上就是这样做的,问题在于svcutil.exe
没有足够准确地生成代理类。
尽管您不控制服务代码,但您可以控制客户端代理代码。您可以尝试手动编辑代理类,svcutil.exe
让您自己添加KnownTypeAttribute
。通过这样做,您可以控制 DataContractSerializer 的行为,只要您注意不要错误地更改数据的传输格式,它就应该仍然有效。