首页 > 解决方案 > Wcf 方法接口作为参数在客户端被视为对象

问题描述

我在 OperationContract 中使用接口作为输入参数。但是当我在客户端生成代理类时,客户端方法被视为:GetDat(object value) 而不是 GetData(IMyObj value)

  1. 服务接口
[服务合同]
[ServiceKnownType(typeof(MyObj))]
公共接口 IService
{
    [运营合同]
    字符串 GetData(IMyObj 值);
}
  1. 服务等级
公共类服务:IService
{
    公共字符串 GetData(IMyObj 值)
    {
        return string.Format("您输入:{0}", value.MyValue);
    }

}
  1. 界面
公共接口 IMyObj
{
    int MyValue { 得到;放; }
}
  1. 数据合约
[数据合约]
[KnownType(typeof(IMyObj))]
公共类 MyObj : IMyObj
{
    [数据成员]
    公共 int MyValue { 获取;放; }
}

注意:stackoverflow 上有很多关于接口参数和 wcf 的类似问题。但他们都告诉使用 ServiceKnownType 属性和 KnownTypeAttribute(我这样做了)。但它仍然给客户端的调用方法一个对象作为参数类型,而不是我的接口类型。

标签: c#wcfserializationdatacontractoperationcontract

解决方案


对于遇到同样问题的其他人。我在https://social.msdn.microsoft.com/Forums/vstudio/en-US/2c52251b-af7f-4529-a2ac-14418ca4b19d/wcf-service-reference-does-not-add上从 Ladislav 找到了这个答案-a-datacontract-of-a-class 的接口定义?forum=wcf

你好,

你不能那样做。DataContract 表示客户端和服务之间传输的数据的定义。这个定义被转换成 XSD,它描述了交换的 XML(序列化数据契约对象)的格式。XML 只能传输数据而不是逻辑,它不会传输有关数据合约实现的任何信息 = 没有继承,也没有接口实现。如果您想在客户端上使用带有接口的数据契约,您必须在程序集中共享该数据契约(不仅是接口),并在生成服务代理时在客户端上重用它。

最好的问候, 拉迪斯拉夫


推荐阅读