问题标签 [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.
c# - 如何跟踪 WCF 序列化问题/异常
我偶尔会遇到在 WCF 序列化期间抛出应用程序异常的问题(在从我的 OperationContract 返回 DataContract 之后)。我得到的唯一(而且意义不大)的信息是
System.ServiceModel.CommunicationException :基础连接已关闭:连接意外关闭。
对内部异常没有任何了解,这使得在序列化过程中很难找出导致错误的原因。
有人知道如何跟踪、记录和调试这些异常的好方法吗?或者更好的是我可以捕获异常,处理它们并将定义的 FaulMessage 发送到客户端吗?
谢谢你
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 元数据的完整性,这意味着不会使用反射进行动态更改。
尝试的解决方案
无法以声明方式更改 XML 属性,因为
<Api>
根元素及其属性是完全通用的(在 中ResponseContract
)。在运行时使用反射更改属性名称空间(例如,'http://example.com/api/Items/GetItemList')没有效果。可以获取属性,但对它们的更改无效。这无论如何都会破坏 WSDL。
在实现 IXmlSerializable 时,写入器在被调用
<Api>
时已经定位在开始标记之后。WriteXml()
只能覆盖 的<Api>
子节点的序列化,这无论如何都不会造成问题。这无论如何都行不通,因为在IXmlSerializable
调用方法之前引发了异常。将常量命名空间与
typeof()
或类似的连接以使其唯一是行不通的,因为命名空间必须是一个常量。默认
DataContractSerializer
可以在名称中插入类型名称(如<ApiOfIdeaList>
),但DataContractSerializer
的输出臃肿且不可读且缺少属性,这对于外部重用者来说是不可行的。扩展
XmlRootAttribute
以生成不同的命名空间。不幸的是,在调用它时没有可用的类型信息,只有通用ResponseContract
数据。可以生成一个随机名称空间来规避该问题,但动态更改模式会破坏 WSDL 元数据。制作
ResponseContract
一个基类而不是一个包装契约应该可以工作,但会导致大量重复的通用数据。例如,<Pages>
在<Item>
上面的例子中也是合约,它们有自己的等价物<Api>
和<Response>
元素。
结论
有任何想法吗?
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]
属性。
serialization - 删除 DataContractSerializer XML 输出中的“d1p1”命名空间前缀
我正在使用DatacontractSerializer
将我的 domainModel 序列化为 xml 文件。我得到如下输出。
而且我想摆脱这些“d1p1”命名空间前缀,只想要</PointDictionary>
like 标记而不是</d1p1:PointsDictionary>
. 我已经尝试将 DataMember 属性放在我的类属性上,但它并没有解决很多问题。由于最终用户可以编辑输出 XML 文件,因此与上述文件相比,我想要一个看起来更清晰的 XML 文件。
首要任务是仅通过代码控制它,如果不可能,则使用 XSLT 或任何其他模式。
c# - WCF 序列化异常 - NetDataContractSerializer
我在尝试将数据集合发送到我们的服务时遇到错误。但是,如果我只向集合中添加一个项目,那么它可以正常工作。一旦我添加了一个以上的项目,我就会收到以下错误
NetDataContractSerializer 不支持将类型“SmartTrade.Shared.Common.PaymentTerm”用作 get-only 集合。考虑使用 CollectionDataContractAttribute 特性或 SerializableAttribute 特性来标记类型,或者向属性添加设置器。
所以这里要注意的关键是我可以将集合 (IList<>) 与单个项目一起发送。我已将 MaxReceivedMessageSize 和 MaxArrayLength 增加到我认为更合理的值。
有人可以帮我吗
wcf - 为什么 WCF 中的消息似乎总是 SOAP 格式?
我通过实现在 WCF 中实现了一个消息检查器IDispatchMessageInspector
。
在这个方法上设置一个断点......
...我可以看一下request
物体,看看里面有什么。
显然我对 WCF 的理解不够,因为无论我使用什么端点绑定(basichttp、nettcp 和 netpipe),内部的消息总是以 SOAP 格式表示,例如
这是因为对请求对象执行 .ToString() 仅代表 SOAP 格式的消息吗?
我想象使用另一种协议,例如 netTcp 会导致不同的消息负载。
还可以说我想以 JSON 格式表示我的数据,我将如何去做呢?或者我最终会在 SOAP 信封中使用 JSON 格式的数据结构吗?
c# - 实体框架中循环引用的 WCF Datacontract 序列化问题
我正在使用 Entity Framework 4,在一些实体之间有循环引用,但是我得到了 stackoverflow 异常,这是启用延迟加载的情况......
然后我将延迟加载启用为false,并使用Include()
方法包含所有相关实体,但仍然出现相同的错误......需要帮助......
c# - 保持 WCF 传输的对象放气/序列化
可能重复:
仅获取 WCf 消息的正文
早上好,
我有一个 WCF 服务,它构建一个复杂的对象,然后将它发送到消费客户端。目前该服务运行良好,但 xml 在客户端上重新膨胀/反序列化,我不希望这样,因为客户端想要使用 XML。
那么有没有办法获取作为 WCF 服务响应的一部分传输的“XML 文档”。当然,我可以在客户端再次对其进行序列化,但如果可以避免额外的步骤,为什么还要这样做。
TIA JB
wcf - 带有对象序列化的 WCF 策略行为
最近我在 WCF 序列化中遇到了一个奇怪的行为。
它是一个简单的服务,它公开一个操作契约并返回一个类的对象(这个类没有用 [Serializable] 或 [DataContract] 属性修饰。
但是,当我从客户端调用此操作时,它可以完美运行,并且消费者会收到该类的对象(其中包含实际数据)。
据我认为它不应该通过电线传递,因为它不能被序列化,如果我遗漏了什么,请告诉我。
代码示例
datacontractserializer - 如何在 Data Contract 中定义字符串数组?
我在数据合同中有一个字符串数组,如下所示
在 WCF REST 服务调用中,我在此字符串数组的 xml 输入下方传递
我的客户端代码能够通过在 HttpWebRequest 中传递 xml 来毫无问题地进行 WebService 调用,从服务中我可以看到除此字符串数组之外的所有其他数据。我是否在 DataContract 中遗漏了一些东西来序列化数组。请帮忙
尝试如下 CollectionDataContract 仍然没有运气
还添加了 KnownTypes 但序数类型不需要
这是完整的数据合约类