问题标签 [messagecontract]

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

wcf - WCF DataContractSerializer 不获取合同属性......为什么不呢?

我有以下类型,我在 WCF 中用作消息协定:

当我使用svcutil.exe生成此类型的代理时,我得到了一个客户端,该客户端能够与托管它的服务进行通信,并且元素上的 XML 命名空间根据消息合同属性是正确的。

当我Message.CreateMessage(...)在它的实例上使用时,命名空间恢复为默认值(http://schemas.datacontract.org/2004/07/..)。当我使用 的实例时DataContractSerializer,会发生同样的事情。我尝试将命名空间传递给DataContractSerializer构造函数,并且只有包装器包含在命名空间中:

此时,“数据”是:

为什么DataContractSerializer出现忽略MessageContract属性?svcutil如何获得这项工作?

0 投票
5 回答
4338 浏览

wcf - WCF 消息契约继承

我对 WCF 相当陌生,只是对如何正确获取 MessageContract 继承有疑问。我的设置的简化版本如下 - 一个“基本”消息类型,然后是另一个继承自它的“测试”消息。

然后,我在 ServiceContract 上有一个异步 OperationContract,定义为:

我遇到的问题是,当调用 BeginFindRequest 方法并为请求参数传入 TestMessage 实例时,WCF 框架将 TestMessage 实例反序列化为服务/服务器端的 BaseMessage。由于这被定义为抽象类,因此会导致以下错误:

“消息无法反序列化为 MessageContract 类型 BaseMessage,因为它没有默认(无参数)构造函数。”

从我可以找到的关于 MessageContract 继承的有限信息来看,它似乎应该可以工作。

所以我的问题是——为了让它发挥作用,我缺少什么;或者我是否应该在 ServiceContract 上专门为该类型定义一个单独的 OperationContract - 缺点是我最终可能会得到许多额外的 OperationContract?

0 投票
2 回答
688 浏览

wcf - 如何在 WCF 中通用地执行服务操作?

我正在寻找一种方法来完成下面源代码中所示的行为。我使用“始终生成消息合同”选项创建了 WCF 服务代理。我所有的请求和响应消息合约都实现了一个通用接口,我想使用相同的函数来执行它们。在我看来,应该有一种通过客户端代理发送消息的通用方式,但我在任何地方都找不到。任何帮助将不胜感激!

我目前在 NutrientDBClient 中添加了一个 ExecutePagedRequest(IPagedRequest) 方法,并根据 IPagedRequest 的具体类型手动执行正确的服务操作。我正在寻找一种更优雅的方式,以便我可以简单地在消息合约上实现 IPagedRequest 并且它会自动神奇地工作。

0 投票
2 回答
880 浏览

.net - 使用 MessageContract 时 Webservice Response 变成 ref 参数

我已经定义了以下接口

返回以下类型

我希望生成的客户端代码会通过以下方式公开 OrderSelfSignedHealthCertificate 方法:

相反,ResponseClass的属性没有包装在 ResponseClass 中,而是像这样公开:

当我将 MessageContract 交换为 DataContract 属性并将 MessageBodyMember 交换为 DataMember 属性时,我得到了预期的行为(ResponseClass 响应类型)。但是,我需要 MessageContract,因为我需要将一些属性放在 SOAP 标头中。

难道我做错了什么?这是正常行为吗?使用 MessageContract 时如何获得ResponseClass返回类型?

非常感谢任何帮助。

0 投票
5 回答
9953 浏览

wcf - 添加服务参考正在生成消息合同

当我在 Visual Studio 2008 (SP1) 上使用“添加服务参考”导入给定服务时,所有请求/响应消息都被不必要地包装到消息协定中(命名为 -->“操作名称”+“请求”/“响应”+ “1”在结尾)。

代码生成器说:

从 Java 服务生成 wsdl 的人说他们正在指定DOCUMENT-LITERAL/WRAPPED

任何帮助/指针/线索将不胜感激。

更新:这是我的 wsdl 示例,其中一个操作看起来很可疑。请注意与响应相比,请求的消息元素属性不匹配。

更新 2:我将导入的命名空间中的所有类型(它们位于单独的 xsd 中)拉到 wsdl 中,因为我怀疑导入可能会触发消息合同的生成。令我惊讶的是,情况并非如此,在 wsdl 中定义的所有类型并没有改变任何东西。

然后我(出于绝望)开始从头开始构建 wsdls 并使用maxOccurs包含在序列属性中的元素属性的属性,我能够重现不希望的消息合同生成行为。

这是一个元素的示例:

maxOccurs使用用作消息的元素(基本上所有请求和响应)会发生以下情况:

  • maxOccurs = "1" 不会触发换行
  • macOcccurs > 1触发换行
  • maxOccurs = "unbounded"触发换行

我还不能在我的生产 wsdl 上重现它,因为类型的嵌套非常深,我需要时间来彻底检查它。与此同时,我希望它可能会敲响警钟- 非常感谢任何帮助。

0 投票
1 回答
988 浏览

.net - MessageContract、通用返回类型和客户端命名问题

我正在构建一个使用 MessageContracts 的 Web 服务,因为我想将自定义字段添加到我的 SOAP 标头中。在上一个主题中,我了解到必须包装复合响应。为此,我设计了一个通用的 ResponseWrapper 类。

我做了一个ServiceResult基类,定义如下:

为了能够在响应中包含请求上下文,我使用 ServiceResult 的派生类,它使用泛型:

这以以下方式使用

我希望我的客户端代码生成为

相反,我得到以下信息:

CompType1并且CompType2RequestContext类的属性。问题是在ServiceResultOfHCCertificateRequestzSOTD_SSj. 我如何需要定义我的通用返回类型才能按预期生成客户端类型(没有哈希)?

0 投票
2 回答
3828 浏览

.net - 将单个数组作为参数的 WCF 操作可以使用 MessageContracts 吗?

我正在尝试用 WCF 服务替换 asmx WebService。我的主要目标是保持 SOAP 消息相同。调用者不是 .NET,需要大量返工才能对合同进行细微更改。

我的痛点是我试图替换 webmethod 的 web 方法使用以下属性减速:

这会移除每个参数周围的额外 XML 元素层。

我知道使用 WCF 进行模拟的唯一方法是使用 MessageContracts 而不是 DataContracts,并使用 WrappedName 和 IsWrapped 属性来控制参数的格式。

这种方法适用于我的所有方法,除了一个方法,它将 POCO 对象的单个数组作为参数。

我的结论是我别无选择。我无法升级此 Web 服务并维护相同的合同。

我的问题是:

1)是复制的唯一方法:

在 WCF 中的 Web 方法上使用 MessageContract?

2)有没有办法让一个方法将单个数组作为参数?

这是我一直在使用的一个简单示例,用于展示我所看到的/使用 [SoapDocumentMethod(ParameterStyle = SoapParameterStyle.Bare)] 和消息合同所做的事情

后备服务代码:

POCO 对象:(带有数据合同的 V1)

ASMX 肥皂

SOAP 请求,带有 WCF 数据协定

让我们在参数和返回类型上使用消息契约:POCO 对象:(带有 MessageContracts 的 V2)

WCF 肥皂请求 (V2):

这就是我现在正在做的,它满足了我需要的 90%。

问题是,我想在 WCF 中实现这样的方法并保持合同不变:

当我现在这样做时,我得到以下异常,因为 AddReq [] 不是 MessageContract。AddReq [] 是 System.Array 类型,我无法更改。

无法加载操作“AddArrays”,因为它具有 System.ServiceModel.Channels.Message 类型的参数或返回类型,或者具有 MessageContractAttribute 和其他不同类型参数的类型。当使用 System.ServiceModel.Channels.Message 或带有 MessageContractAttribute 的类型时,该方法不得使用任何其他类型的参数。

谢谢,布赖恩

0 投票
1 回答
1797 浏览

wcf - WCF 使用消息协定序列化枚举

我有一些使用消息合同的网络服务。可能值得一提的是,对于这些服务,我不能转向数据合同......

我的一种类型指定了一个其类型恰好是枚举的属性:

ETC

我的枚举定义为:

但是当我通过网络发送它时,RiskTypeCode 属性没有被序列化——即它被从输出中省略了。

我需要什么来装饰我的枚举/属性才能让它穿过电线?

0 投票
1 回答
1360 浏览

c# - 使用 DCS 的 MessageContract 序列化

有没有办法使 DataContractSerializer 序列化的[MessageContract]方式与通过 SOAP 传输时出现的方式相同?

我有一个类在 WCF 调用的线路上显示如下:

p>

使用 DCS 进行序列化时,如下所示:

p>

我确信这种不一致是因为我的类被标记为消息合约而不是数据合约:

p>

有没有办法让 DCS 序列化消息,就像 WCF 在创建 SOAP 消息时所做的那样?

0 投票
1 回答
1354 浏览

wcf - WCF DataContractSerializer 行为

我在使用 DataContractSerializer 时看到了一些异常行为。我已经定义了一个消息契约,如下所示:

我正在向它发送一条如下所示的 XML 消息:

我的服务按预期反序列化此 XML。在我的服务中,我使用 DataContractSerializer 创建一个 XML 字符串,这就是事情变得奇怪的地方。我正在使用这样的序列化程序:

完成后,outputMessage 将包含以下 XML:

不用说,任何期望接收原始 XML 消息的东西都无法解析它。所以我想我有两个问题:

  1. 为什么 DataContractSerializer 将额外的外部节点添加到我的 XML 输出中?
  2. 有没有办法阻止它这样做?

谢谢。

我可能应该添加这是.NET 4。