问题标签 [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 投票
2 回答
4229 浏览

c# - 来自配置中 System.Object 的 WCF 已知类型

我正在尝试在我的配置中指定一个已知类型,但我遇到了它派生自 Object 的问题。我可以让它通过属性指定已知类型。但在这种情况下,我需要让它从配置中工作。

这是一个例子。以下工作正常:

但是,如果我删除 ServiceKnownType 属性并将以下内容放入配置中:

我收到 ConfigurationErrorsException 消息“属性‘类型’的值无效。错误是:类型 System.Object 不能用作配置中的声明类型。”

有没有办法通过配置来完成这项工作?

0 投票
4 回答
36633 浏览

c# - 什么时候适合使用 KnownType 属性?

在阅读了 MSDN 参考之后,我仍然对何时使用 KnownType 属性有疑问。我知道该属性将类型信息传达给序列化程序,但是什么时候需要呢?当被序列化的类具有基类类型的引用并且存在可以设置为这些引用的向上转换派生类时是否合适?

此外,过度使用该属性有什么缺点吗?例如,在前面的示例中,如果序列化的类被标记为 KnownType(baseClass) 即使有对该类型的显式引用?

0 投票
1 回答
578 浏览

c# - 为什么我的对象不需要 ServiceKnownType?

据我了解,WCF ServiceContract 中使用的每种类型(除了一些基本类型,如 int 和 string)都需要使用 ServiceKnownType 属性进行声明。但是,我已经构建了一个自定义对象,并且它可以毫无问题地通过我的 WCF 服务进行传输——即使我没有为它添加 ServiceKnownType。有人能解释一下为什么会这样吗?

0 投票
1 回答
4378 浏览

wcf - WCF net.pipe 在收到响应时中止

这已解决


这是我无法从服务电话中获得的合同:

这是它的基本类型,

IServiceType是一个接口。我意识到我无法通过网络发送接口。有一个 EntityFramework 实体,ServiceType实现IServiceType接口:

ServiceType我的目标是通过myInitializationData合同通过网络发送实体。

我无法使用 KnownType 来装饰myInitializationDataorClientInitializationDataServiceType,因为这些类与 Silverlight 项目共享(链接)。因此,如果我用 KnownType 装饰这些类中的任何一个ServiceType,Silverlight 端将无法编译。

我没有直接装饰类,而是使用 ServiceKnownType 来装饰服务合同ServiceType

这应该工作吗?

调用时IService.InitializeClient,我在客户端收到以下错误:

我已启用跟踪调试,但在客户端或服务器的跟踪中没有发现有关序列化失败的消息。

服务器跟踪:

  • 在频道中接收消息(操作:http ://tempuri.org/IService/InitializeClient )
  • 至:执行(IService.InitializeClient
  • 来自:执行(IService.InitializeClient
  • 通过通道发送消息(操作:http ://tempuri.org/IService/InitializeClientResponse )
  • 警告错误 System.ServiceModel.Channels.ServerSessionPreambleConnectionReader+ServerFramingDuplexSessionChannel
  • 警告错误 System.ServiceModel.Channels.ServiceChannel
  • 回复操作引发异常(ObjectContext 实例已被释放,不能再用于需要连接的操作。

客户端跟踪:

  • 通过通道发送消息(操作:http ://tempuri.org/IService/InitializeClient )
  • 抛出异常(从管道读取错误:管道已结束。(109,0x6d)。

如果我ServiceTypes从 DataContract 中选择该属性ClientInitializationData,此错误就会消失。所以我认为这一定是一个序列化问题:接口和 KnownTypes,但 WCF 并没有声称在跟踪中有任何序列化问题,我不确定跟踪在这种情况下意味着什么。


解决方案

这不是 KnownTypes 问题。ServiceType这是在定义类型的实体上下文上自发启用 LazyLoading 的结果。

虽然没有提到跟踪中(在客户端或服务器端)违反过多消息或缓冲区大小,但我必须假设在 EF 上下文中启用 LazyLoading 导致 DataContractSerializer 触发 EF 获取大量记录,这反过来导致在线上(尝试)了一个巨大的图表。在消息写入期间,服务器端只是简单地(并且模棱两可地)使通道出错。

在 EF 上下文中将 LazyLoading 返回到禁用状态已经解决了这个问题。

0 投票
3 回答
6442 浏览

c# - 将接口与 WCF 一起使用

我已经谷歌搜索并阅读了几个小时,但找不到任何处理我的特定场景的人......

我想在我的 WCF 服务合同中使用接口将服务与线路两端使用的类松散耦合。这将使我们能够拥有一个仅包含服务和数据合同(只是接口)的低级程序集,我们可以将其交给顾问。在他们的网络末端,他们可以实例化实现我们的数据契约接口的数据类,通过网络将其发送给我们,然后我们的 WCF 服务将把传入的数据转换/转换/任何内容到我们实现的数据类版本中同一个界面。

这是一个例子。IDataContract包含我想通过网络传输的裸信息。端点和其他特定于 WCF 的配置都是默认的东西(我的问题可能在于,所以如果我需要更改内容,我可以包含更多内容)。

编辑:我已经包含了更多的代码并重命名了几个类以帮助它减少混乱。DataContractAttributes 的名称和命名空间添加以及配置文件中的两个部分是基于此博客文章中的信息的新增内容。如果我切换到抽象基类而不是接口,它可以工作。但是,如果可能的话,我想让它与接口一起工作。

共享库(我的代码,与客户作者共享):

客户代码(他们的):

客户端配置:

服务器代码(我的):

服务器配置:

我在抱怨已知类型的客户端调用中收到序列化错误。我只是缺少该客户端类中的一些元数据标记吗?我什至不知道问题出在哪里,因为我已经尝试了所有我能想到的搜索,但似乎没有人处理过这种特定情况。

基本上,我想ClientDataClass序列化<IDataContract><MyProperty>client data</MyProperty></IDataContract>,然后能够将其反序列化为一个ServerDataClass实例。这似乎应该是可能的。

0 投票
2 回答
278 浏览

wcf - WCF KnownType 属性的使用是否总是一个 hack?

我只见过它被用来“克服”OOP 和 SOA 之间的差异。

0 投票
2 回答
530 浏览

wcf - 通过配置调试添加已知类型

我已经解决了一段时间了,我不知道为什么我可以使用配置来添加对已知类型的引用,或者如何去调试它。任何指针都可能挽救我的理智。

我有一个托管在 Windows 服务中的 WCF 服务,并且我有一个该服务的配置文件。在配置中我有这个:

我已经尝试在Version=1.0.0.0,Culture=neutral,PublicKeyToken=null两个声明中添加 ,但我似乎无法让数据合同序列化程序拾取它们。

我已经验证了这个类可以返回(通过添加 a [ServiceKnownType(typeof(My.Implementation.Class))])并且有效,但是我有另一个我想使用的实现是在另一个程序集中,如果我添加它会创建一个循环引用,所以不能使用它.

如何调试数据合同序列化程序找不到我的类型的原因?或者我的声明有什么问题?

0 投票
1 回答
516 浏览

wcf - Mono 2.10 / MonoTouch 4.0 中的 WCF KnownTypes

我有一个使用 WCF 的应用程序。它在 Ubuntu 上的 Mono 2.8.2 和 Windows 上的 .NET 3.0 上运行良好。

它使用“ServiceKnownType”属性装饰 WCF 服务契约,该属性指向返回使用服务器所需的派生类型的方法:

我正在将我的应用程序移植到 MonoTouch。我正在使用基于 Mono 2.10.1 的最新 4.0。这不再有效:我的 WCF 调用失败,因为客户端上的 DataContractSerializer 无法识别返回类型。

我在“GetKnownTypes”方法中设置了一个断点,发现它从未被调用过。我假设这部分 System.ServiceModel 在 MonoTouch 中不存在/不工作?

我尝试通过使用“KnownType”属性装饰基本返回类型来解决此问题。

再次,它不起作用,我的“GetKnownTypes”方法永远不会被调用。查看 DataContractSerializer 的源代码,似乎如果您使用方法名称而不是指定类型,它就会被忽略?!

我将通过指定类型而不是使用方法再次尝试(查看 DataContractSerializer 的源代码,看起来这将起作用),但是这在 MonoTouch 中对我来说很棘手,因为我需要使用 typeof 而不是 Type.GetType( “完全合格的类型名称”)。

还有其他解决方案吗?解决方法?

我确实看到了:如何以编程方式配置 WCF 已知类型?,但似乎 MonoTouch 缺少一些必需的接口......

提前致谢

0 投票
1 回答
1560 浏览

c# - WCF - 已知类型的对象 - >可互操作?

实际上,这个问题应该有一个直接的答案(关于下面的“对象”属性):

具有以下数据合同:

和以下服务合同:

这将是可互操作的吗?从Java说,gSoap?如果没有,我怎样才能使它具有互操作性?

谢谢你。

编辑: 我只想知道 WCF 是否知道如何从定义的已知类型序列化/反序列化对象。

0 投票
2 回答
972 浏览

wcf - 基类上的 WCF 数据合同 knowntype

我在不需要了解任何其他项目的项目 (Comp.DataContracts) 中有一个数据合同。我有引用 Comp.DataContracts 的 Comp.ProjA,并且有一个派生类,它只是帮助填充数据合同的字段,但与数据合同无关。我想告诉通道使用我的派生类型作为参数进行服务调用,但将其序列化为基本类型。

由于我不希望服务或数据合同项目了解其他项目,我该怎么做?我可以明确告诉 datacontractserializer 序列化为基础而不是派生吗?我总是可以求助于工厂来填充并返回正确的类型,但希望不要这样做。

如果没有基类上的 KnownType,我该怎么做?想法?