问题标签 [known-types]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
336 浏览

wcf - 即使使用 KnownType,派生类型的属性也不会在 WCF 客户端中反序列化

我有以下类型:

在我的服务接口上,我有一个函数,它返回一个 的实例,ConfigurationCredentialValues属性设置为一个完全填充的CustomCredentials. 我没有收到来自客户端或服务器的错误,但是当数据在服务器上被属性序列化并被客户端接收时,属性CustomCredentials永远没有值。为了在客户端正确反序列化这些属性,我需要在这里更改什么?

作为参考,客户端和服务器之间的连接是DuplexChannelFactory通过NetTcpBinding使用由客户端和服务应用程序共享的数据/服务合同项目(服务是自托管的)建立的,因此没有可能需要的服务代理类型被再生。

0 投票
1 回答
206 浏览

wcf - WCF 派生类型和违反 Open/Closed 原则

我有一个在 WCF 服务调用中使用的基类,

我从中派生,每次派生时都必须添加[KnownType(typeof(MyDerivedClass))]属性,并且每次我都违反了开放/封闭原则。反正有没有派生这样的类以在 WCF 中使用,而不必每次都向父类添加属性?

0 投票
1 回答
722 浏览

c# - 如何反序列化未知的类型,不是普通的情况

我正在努力解决一个我还没有找到答案的反序列化问题。场景是这样的:

Silverlight 客户端登录到服务器并取回会话对象。会话对象包含各种信息,其中包括一个称为 UserSettings 的集合。该集合包含一个名为 propertyentity 的类型,它基本上有两个属性,一个字符串和一个对象。反序列化时出现以下错误:

System.Runtime.Serialization.SerializationException:JSON 包含指定数据合同名称“http://www.xyz.se/rc:ClientDifferenceRules”的“__type”成员。反序列化器不知道映射到该合约的任何类型。将与“ClientDifferenceRules”对应的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将其添加到传递给 DataContractSerializer 的已知类型列表中。您通常还可以通过避免使用生成 JSON 的派生类型来消除此错误。

在 session.UserSettings 中发送其他属性时,例如包含普通 int 作为反序列化的效果很好。如何告诉反序列化器它是什么数据类型?

ClientDifferenceRules 如下所示:

ClientDifferenceRulesCollection 看起来像这样:

PropertyEntity 看起来像这样(来自元数据):

0 投票
1 回答
211 浏览

c# - 在服务器之间使用或不使用 KnownType 属性?

我有一个关于在服务器/客户端应用程序之间使用 WCF KnownType 属性的问题,
如您所知,使用 wcf 在服务器和客户端之间传输对象有不同的方式。

  1. 使用已知类型。
  2. 使用 DataContractResolver。
  3. 使用 POCO 传输 knownType 对象的数据(最佳实践)。

(3) 传递数据的最佳方式是什么?它是序列化的(xml / json / bufferProtocol)字符串吗?作为一个类本身(然后我们再次获得 knowntype)?

0 投票
1 回答
746 浏览

wcf - XmlIncludeAttribue 在 WCF DataContract 中使用时的影响

1)Binding创建 ChannelFactory时使用对序列化/反序列化的工作方式有什么影响吗?(我知道使用的绑定应该与服务的服务器端绑定相匹配。)

我在其中一个中使用KnownType属性,DataContract但它不起作用。但是,如果我使用XmlIncludeAttribute,它就可以工作!(我正在将我的 ASMX 服务迁移到 WCF。但我没有使用任何 MessageContracts,因为我也可以自由更新客户端代理。)

[XmlInclude(typeof(Males))] [DataContract] public abstract class Person { [DataMember] public int Name { get; 放; } }

2)如果我使用任何XmlSerializer用于 WCF 的属性(具体来说 - XmlInclude)),WCFDataContract是否使用XmlSerializer而不是DataContractSerializer

0 投票
1 回答
583 浏览

c# - Client Generated 未向第三方提供有关 knowntype 的信息

我的服务有一些关于 KnownType 和继承的问题。我已经阅读了几乎所有类似的问题,但我仍然没有找到解决方案。我将尝试解释:

这是我的界面:

这是我的数据合同:

TransactionItem是(另一个)程序集中提供的抽象类。
客户端项目中使用了相同的程序集,因此我在客户端和服务器中引用了相同的类型。
在客户端,经过一些操作(读取文件等),我有一个继承自TransactionItem的对象数组,说:

在我添加的 Service Web.config

当然,我可以在 [Datacontract] 装饰器上使用KnownTypeAttribute 。

如果在配置服务参考(在客户端项目服务参考中)我检查(默认情况下检查)引用程序集中的重用类型标志,我可以在我的代码中编写:

我可以毫无问题地调用服务。那么问题是什么?
问题是,如果我删除

来自 DataContract 的属性(我不希望客户端使用抽象类)服务进入异常:

尝试序列化参数 MyNameSpace.Components.Web:wtransactionItem 时出错。内部异常消息:类型 'Assemblyname.TransactionHeader' 合同名称为 'TransactionHeader:http://schemas.datacontract.org/2004/07/Assemblyname' 不是预期的。

现在,据我所知,当我没有在服务中指定类型TransactionHeader(继承 TransactionItem)时会发生这种情况,但我指定了(参见 Web.Config 服务的文件,我也尝试过使用 knowntypeAttribute)! !
我还注意到,在客户端项目中自动生成的Reference.cs类中,在第一种情况下(当我离开

财产)

被编码:

在生成的部分类之上。这允许对继承的类进行序列化,但是如果我删除服务中的属性,则部分类(在 Reference.cs 中)不再具有它,这就是服务抛出该异常的原因。就像它错过了对抽象类TransactionItem的引用,即使我已经在 Web.config 文件中指定了它(也通过 KnownTypeAttribute。)。如何解决?

0 投票
2 回答
5065 浏览

c# - Web服务序列化复杂对象

我有一个带有Class1. Class1有一个属性的图像列表

进行 get on 时MyList,会发生以下错误。有任何想法吗?

System.Web.Services.Protocols.SoapException:服务器无法处理请求。---> System.InvalidOperationException:生成 XML 文档时出错。---> System.InvalidOperationException:类型 System.Drawing.Bitmap 不是预期的。使用 XmlInclude 或 SoapInclude 属性指定静态未知的类型。在 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write5_Class1(字符串 n、字符串 ns、Class1 o、 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write6_HelloWorldResponse(Object[] p) 中 Microsoft.Xml.Serialization 中的 Boolean isNullable, Boolean needType)。
在 System.Web.Services.Protocols.SoapServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream) 在 System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues) 在 System.Web.Services.Protocols.WebServiceHandler。 Invoke() --- 内部异常堆栈跟踪结束 ---

0 投票
3 回答
2335 浏览

c# - 数据协定已知类型和一组相互继承的接口

我开发(重写到 WCF)一个文件解析 web 服务接受string[]和返回ISection[],但实际上这是一组嵌套接口:

和类:

服务接口及其实现:

我尝试declaredTypes在服务器和客户端上进行配置:

但仍然得到同样的错误:

“不应使用数据合同名称‘DataSection:http://schemas.example.com/Parse’键入‘DataSectionFormatA’。

或者

基础连接已关闭:连接意外关闭。

我无法使用 KnownTypeAttribute 装饰接口,因为 Contracts 项目不引用 Format 项目,并且引用会破坏设计。这就是为什么我想使用配置。

0 投票
3 回答
2110 浏览

wcf - 无法让 KnownType 与 WCF 一起使用

我在单独的程序集中定义了一个接口和一个类,如下所示:

这是我的服务接口:

当我为我的客户更新我的服务参考时,我在 Reference.cs 中得到了这个:

我希望 KnownType 会给我 IPerson 而不是这里的“对象”。

我也尝试[KnownType( typeof( Person ) ) ]过同样的结果。我可以控制客户端和服务器,所以我在这两个地方都有我的 DataObjects(在其中定义了 Person)和 DataInterfaces(在其中定义了 IPerson)程序集。我有什么明显的遗漏吗?我认为 KnownType 是能够使用 WCF 接口的答案。

----- 更多信息 ----- 我从 Person 类中删除了 KnownType 并添加了

到我的服务接口,正如理查德所建议的那样。客户端代理看起来还是一样的,

,但现在它不会爆炸。但是,客户端只有一个“对象”,因此它必须在它有用之前将其转换为 IPerson。

0 投票
2 回答
976 浏览

c# - WCF中的两个接口和一个具体类

请检查以下示例

ITest 有subtract() 方法,Itest2 有add() 方法。

两者都由一个名为 G 的具体类实现。

如果我只想通过 WCF 公开 ITest,我有以下端点配置

当我运行此服务并检查 wsdl 时,我可以看到 itest2 中的方法也出现在 wsdl 中。在这个例子中,subtract() 方法应该只被暴露。但是 add() 方法也暴露了。

我的要求是 ITest 接口中的方法应该只公开。在这种情况下,我只想公开在 ITest 中声明的减法()方法。但是它们的两个实现都只存在于一个具体的类“G”中。我在这里想念什么?

编辑:我已经给出了我的 Service.svc 文件内容:

在此处输入图像描述