问题标签 [wcf-serialization]

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 回答
7279 浏览

c# - 如何跟踪 WCF 序列化问题/异常

我偶尔会遇到在 WCF 序列化期间抛出应用程序异常的问题(在从我的 OperationContract 返回 DataContract 之后)。我得到的唯一(而且意义不大)的信息是

System.ServiceModel.CommunicationException :基础连接已关闭:连接意外关闭。

对内部异常没有任何了解,这使得在序列化过程中很难找出导致错误的原因。

有人知道如何跟踪、记录和调试这些异常的好方法吗?或者更好的是我可以捕获异常,处理它们并将定义的 FaulMessage 发送到客户端吗?

谢谢你

0 投票
1 回答
1100 浏览

c# - 带有 XmlSerializer 的 WCF:返回通用合同时的命名空间冲突

的背景

我正在使用 WCF 为 C#.NET Web 应用程序开发 REST API。我将其配置为使用 XmlSerializer 而不是其默认的 DataContractSerializer,以便更好地控制 XML 格式。我创建了一个通用数据协定,它使用请求状态、错误消息和命名空间等通用数据包装ResponseContract<TResponse, TErrorCode>响应。一个示例方法:<Api><Response>

ResponseContract<ItemListContract, ItemListErrorCode> GetItemList(...)

上述方法的示例响应:

问题

ResponseContract这对于方法都具有相同泛型类型的服务非常有效。WCF orXmlSerializer期望每个合约在其命名空间中具有唯一名称,但服务现在返回具有相同 XML 根名称的不同类型的通用合约:

结果异常:

服务必须允许不同的返回类型。这很难实现,因为ResponseContract<TResponse, TErrorCode>(设置名称和命名空间)是通用的,并且由所有 API 方法返回。我还需要维护WSDL 元数据的完整性,这意味着不会使用反射进行动态更改。

尝试的解决方案

  1. 无法以声明方式更改 XML 属性,因为<Api>根元素及其属性是完全通用的(在 中ResponseContract)。

  2. 在运行时使用反射更改属性名称空间(例如,'http://example.com/api/Items/GetItemList')没有效果。可以获取属性,但对它们的更改无效。这无论如何都会破坏 WSDL。

  3. 在实现 IXmlSerializable 时,写入器在被调用<Api>时已经定位在开始标记之后。WriteXml()只能覆盖 的<Api>子节点的序列化,这无论如何都不会造成问题。这无论如何都行不通,因为在IXmlSerializable调用方法之前引发了异常。

  4. 将常量命名空间与typeof()或类似的连接以使其唯一是行不通的,因为命名空间必须是一个常量。

  5. 默认DataContractSerializer可以在名称中插入类型名称(如<ApiOfIdeaList>),但DataContractSerializer的输出臃肿且不可读且缺少属性,这对于外部重用者来说是不可行的。

  6. 扩展XmlRootAttribute以生成不同的命名空间。不幸的是,在调用它时没有可用的类型信息,只有通用ResponseContract数据。可以生成一个随机名称空间来规避该问题,但动态更改模式会破坏 WSDL 元数据。

  7. 制作ResponseContract一个基类而不是一个包装契约应该可以工作,但会导致大量重复的通用数据。例如,<Pages><Item>上面的例子中也是合约,它们有自己的等价物<Api><Response>元素。

结论

有任何想法吗?

0 投票
1 回答
201 浏览

model-view-controller - MVCContrib CustomPagination WCF 序列化

CustomPagination<T> (datasource, page number, page size, and total items count) 我在 WCF 服务中检索的所有参数。如果我可以在 WCF 中实例化 CustomPagination 并将其传递回我的应用程序,那就太棒了。但是,它看起来无法序列化 CustomPagination 对象,因为它缺少 和 之类[DataContract]的属性[DataMember]

我知道我可以单独或在另一个自定义对象中传回 CustomPagination 所需的所有值,但是只传回一个准备好使用 CustomPagination 对象会更好。对此有何建议?


尝试在我的应用程序中更新我的服务引用时出现的错误:

无法序列化类型“MvcContrib.Pagination.CustomPagination`1[Myproject.WCFServices.DataContracts.User]”。

用户对象标有适当的[DataContract][DataMember]属性。

0 投票
3 回答
14929 浏览

serialization - 删除 DataContractSerializer XML 输出中的“d1p1”命名空间前缀

我正在使用DatacontractSerializer将我的 domainModel 序列化为 xml 文件。我得到如下输出。

而且我想摆脱这些“d1p1”命名空间前缀,只想要</PointDictionary>like 标记而不是</d1p1:PointsDictionary>. 我已经尝试将 DataMember 属性放在我的类属性上,但它并没有解决很多问题。由于最终用户可以编辑输出 XML 文件,因此与上述文件相比,我想要一个看起来更清晰的 XML 文件。

首要任务是仅通过代码控制它,如果不可能,则使用 XSLT 或任何其他模式。

0 投票
2 回答
2269 浏览

c# - WCF 序列化异常 - NetDataContractSerializer

我在尝试将数据集合发送到我们的服务时遇到错误。但是,如果我只向集合中添加一个项目,那么它可以正常工作。一旦我添加了一个以上的项目,我就会收到以下错误

NetDataContractSerializer 不支持将类型“SmartTrade.Shared.Common.PaymentTerm”用作 get-only 集合。考虑使用 CollectionDataContractAttribute 特性或 SerializableAttribute 特性来标记类型,或者向属性添加设置器。

所以这里要注意的关键是我可以将集合 (IList<>) 与单个项目一起发送。我已将 MaxReceivedMessageSize 和 MaxArrayLength 增加到我认为更合理的值。

有人可以帮我吗

0 投票
1 回答
1134 浏览

wcf - 为什么 WCF 中的消息似乎总是 SOAP 格式?

我通过实现在 WCF 中实现了一个消息检查器IDispatchMessageInspector

在这个方法上设置一个断点......

...我可以看一下request物体,看看里面有什么。

显然我对 WCF 的理解不够,因为无论我使用什么端点绑定(basichttp、nettcp 和 netpipe),内部的消息总是以 SOAP 格式表示,例如

这是因为对请求对象执行 .ToString() 仅代表 SOAP 格式的消息吗?

我想象使用另一种协议,例如 netTcp 会导致不同的消息负载。

还可以说我想以 JSON 格式表示我的数据,我将如何去做呢?或者我最终会在 SOAP 信封中使用 JSON 格式的数据结构吗?

0 投票
2 回答
1884 浏览

c# - 实体框架中循环引用的 WCF Datacontract 序列化问题

我正在使用 Entity Framework 4,在一些实体之间有循环引用,但是我得到了 stackoverflow 异常,这是启用延迟加载的情况......

然后我将延迟加载启用为false,并使用Include()方法包含所有相关实体,但仍然出现相同的错误......需要帮助......

0 投票
1 回答
201 浏览

c# - 保持 WCF 传输的对象放气/序列化

可能重复:
仅获取 WCf 消息的正文

早上好,

我有一个 WCF 服务,它构建一个复杂的对象,然后将它发送到消费客户端。目前该服务运行良好,但 xml 在客户端上重新膨胀/反序列化,我不希望这样,因为客户端想要使用 XML。

那么有没有办法获取作为 WCF 服务响应的一部分传输的“XML 文档”。当然,我可以在客户端再次对其进行序列化,但如果可以避免额外的步骤,为什么还要这样做。

TIA JB

0 投票
1 回答
95 浏览

wcf - 带有对象序列化的 WCF 策略行为

最近我在 WCF 序列化中遇到了一个奇怪的行为。

它是一个简单的服务,它公开一个操作契约并返回一个类的对象(这个类没有用 [Serializable] 或 [DataContract] 属性修饰。

但是,当我从客户端调用此操作时,它可以完美运行,并且消费者会收到该类的对象(其中包含实际数据)。

据我认为它不应该通过电线传递,因为它不能被序列化,如果我遗漏了什么,请告诉我。

代码示例

0 投票
2 回答
1774 浏览

datacontractserializer - 如何在 Data Contract 中定义字符串数组?

我在数据合同中有一个字符串数组,如下所示

在 WCF REST 服务调用中,我在此字符串数组的 xml 输入下方传递

我的客户端代码能够通过在 HttpWebRequest 中传递 xml 来毫无问题地进行 WebService 调用,从服务中我可以看到除此字符串数组之外的所有其他数据。我是否在 DataContract 中遗漏了一些东西来序列化数组。请帮忙

尝试如下 CollectionDataContract 仍然没有运气

还添加了 KnownTypes 但序数类型不需要

这是完整的数据合约类