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

wcf - 返回 MessageContract 的 WCF 服务方法有效,但服务本身会引发错误

我需要创建一个包含几个操作合同的WCF restful 服务,其中一个GET类型的操作合同将输入参数作为字符串 ID 并返回一个 MessgeContract(因为我需要修改 SOAP 主体结构,所以我使用了 MessageContract )。

现在,当我http://appname/service1.svc在浏览器中浏览服务时,它抛出异常,说服务方法不能同时使用原始参数和 MessageContract 返回类型,但是当我以 : 执行服务方法时http://appname/service1.svc/Method1?ID=2,它可以工作,并给我所需的输出并且不抛出任何例外。我应该继续使用它,因为我的所有操作合同方法都正确执行,除了服务之外,我应该做些什么来改进它。

0 投票
0 回答
202 浏览

wcf - 如果我们可以通过数据合约和安全性来实现,为什么要使用消息合约

当我们将身份验证详细信息传递给soap标头时,我们可以使用消息合约,而不是像ex一样在数据合约中作为参数传递。许可证密钥或用户凭据。传递参数是不安全的。但是我们可以使用安全性(传输或消息)来保护数据合约。为什么我们需要messageContract?那么消息合约和数据合约有什么区别/

“消息合约完全控制 SOAP 消息,我们还可以添加保护级别,消息可以加密和安全。它可能是对 SOAP 标头信息进行签名或加密。当您从服务生成 WSDL 时,混合消息和数据合约将导致运行时错误。”

0 投票
1 回答
827 浏览

wcf - WCF 中 MessageContract 的 KnownType

Stream在我的 wcf 合同中使用对象,因此被迫使用MessageContract而不是DataContract.

我希望此服务的使用者创建 A 或 B 的对象并使用它调用服务。在服务方面,我可以将其类型转换为适当的对象,然后执行一些操作。

问题是我不能指定KnownTypewithMessageContract并且继承的合同不能暴露给客户,直到它们在服务中使用或声明为KnownType.

我尝试用谷歌搜索,但找不到与KnownTypewith相关的任何内容MessageContract

正如评论中所建议的......我更新了我的消息合同,KnownType但它们仍然没有通过服务参考暴露给客户......

任何人都可以帮助我这里有什么问题吗?

注意:ALLKnownType继承自Document

0 投票
1 回答
280 浏览

c# - 如何在同一个类中同时使用 MessageContract 和 CollectionDataContract?

我有以下 Web 服务代码:

该服务接受以下 SOAP 请求:

但是,它应该接受以下 SOAP 请求(没有“CustomStrings”标签):

如果我不使用 MessageContract,像这样:

我能够实现以下 XML,这与我想要的很接近:

但是存在“GetStringCollection”标签,这是 MessageContract 帮助我删除的。

所以我需要 MessageContract 和 CollectionDataContract,但如果我执行以下操作:

我得到一个例外:

“异常详细信息:System.InvalidOperationException:WcfService1.StringCollection 类型定义了 MessageContract,但也派生自未定义 MessageContract 的类型 System.Collections.Generic.List`1[System.String]。ÿ继承中的所有对象WcfService1.StringCollection 的层次结构必须定义一个 MessageContract。”

所以问题是:有没有办法在顶级类中同时使用 MessageContract 和 CollectionDataContract ?如果没有,我该如何接受通缉请求?

0 投票
0 回答
557 浏览

c# - WCF MessageHeader 属性未反序列化

我正在 WCF 中开发基于 SOAP 的 Web 服务。

我的客户端使用以下 SOAP 请求 xml 向 WCF 服务发送请求:

我创建了MessageContract类以将值传递给客户端或从客户端获取值。

MessageContract类中有多个MessageHeader属性属性,但是当请求发送到服务器时,具有属性的MessageHeader属性不会反序列化,并且始终为null

RequestHead标签中有前缀me,我认为它在 WCF 服务处反序列化对对象的 XML 请求会产生问题

但在RequestBody标签中也有前缀m,但它反序列化成功。

me当我从标签中删除前缀时,RequestHead它就成功了。我得到了MessageHeader属性属性的值。

我的课程:

我在 WCF 服务中的操作方法如下所示:

当我使用以下代码检查请求 SOAP XML 时:

它还为我提供了带有标头值的完整请求 SOAP XML,但不会将其反序列化为对象。

我不明白我哪里出错了,或者我遗漏了一些东西。

这是同样的问题,但到目前为止还没有得到任何回答:如何在 WCF 中反序列化自定义 SOAP 标头?

感谢帮助...

0 投票
0 回答
286 浏览

xml - WCF MessageContract 复杂类型属性未反序列化

我必须实现一个服务来处理这个 SOAP 消息:

消息合约目前看起来像:

operationParam我的服务正确解析了字符串属性。但无论我做什么,我都无法让“复杂类型”operationHeader工作。

OperationHeader使用上面的代码,无论XmlTypeXmlElement声明如何,其上的属性始终为空:

我已经尝试过OperationHeader没有属性、MessageBodyMember属性、将 XML 类型装饰为匿名的类的变体。类的所有成员仍然为空OperationHeader

非常奇怪的是,如果我这样做:

那么解析出来的XML元素就不是它operationHeader本身了,而是来自XML的第一个子元素;headerParamA.

有谁知道我的课程应该是什么样子?

我已经尝试完全按照这个答案来做,但这也只会为复杂类型的成员属性提供 null 。

或者我发送的 XML 是否以某种方式损坏?

0 投票
1 回答
262 浏览

c# - 如何使 WCF 中的 MessageContract 订单不可知?

我有一个使用 MessageContracts 的 WCF 服务。让我头疼的是,如果消息中元素的顺序发生变化,那么服务将忽略该元素。这是一个示例(删除了不相关的详细信息):如果我发送

然后就可以了。但是,如果我发送

然后 Bananas 值被忽略,并以 NULL 的形式出现。我的 MessageContract 类如下所示:

我还应该提到我们正在使用 DataContractSerializer,虽然我在这里的示例是简单的字符串,但实际的消息对象要复杂得多,并且包括列表和 DataContract 对象。

看起来 WCF 默认按字母顺序排列成员。老实说,我什至不在乎使用什么排序。我想要的是让消费者能够以他们想要的任何顺序传递这些值,并且让服务仍然有效。即使没有指定顺序,XML 也很容易阅读,所以这似乎应该是可行的。

请注意,我真的不想更改序列化程序或从 MessageContract 更改为 DataContract - 这是我们生产环境中的现有服务,我真的无法做出会导致 WSDL 与现有代码不兼容的更改。当我尝试将这些 MessageContracts 更改为 DataContracts 时,它会导致 WSDL 的结构发生足够的变化,以至于与现有代码不兼容。

0 投票
0 回答
735 浏览

c# - WCF:将值类型参数传递给返回消息协定的操作

情况:

我有这个服务合同:

在这种情况下,Group 有一个消息契约,并且这个消息契约继承了服务契约的安全级别。组如下所示:

GUIDWRAPPER 类型是一个简单的 Guid 包装器,它也有一个消息契约:

问题:

当我启动我的服务主机时,它抱怨操作“GetB”无效,因为返回类型“Group”有消息协定,而值类型“int”没有。这是一个可能的安全漏洞。

“GetA”没有问题,因为返回类型和参数类型都有消息协定。

可能的解决方案:

1.) 我可以包装所有值类型,就像我对 GUIDWRAPPER 类所做的那样,并给它们一个消息契约。但这对我来说感觉又脏又臭。

2.) 删除所有消息合约,只使用数据合约。然后我失去控制,发送和接收哪些数据。

我的问题:

是否可以将简单的值类型(如本例中的 int)传递给具有消息合同返回类型的服务操作?(如本例中的 GetB)

运营合同是否有任何属性允许这样做?

0 投票
1 回答
1826 浏览

c# - 向 MessageContract WCF 响应对象 (MessageBodyMember) 添加多个命名空间

我们有一个带有以下合约的 WCF 设置:

  • 这些基于使用xsd.exe.
  • 然后,我们更改架构以使用自定义命名空间添加自定义元素以区分它并重新生成类。
  • 这工作得很好。

它补充说:

这是想要的。

然后在 WCF 服务中,我们可以使用新的类和成员:

然后将其序列化并通过网络发送,如下所示:

这几乎是正确的。问题在于 XML 文档没有对"urn:bccdx.ca"命名空间的引用。我假设它会在序列化时自动添加到文档根元素中,但我错了。这就是最终的样子:

当真正需要的是:

注意带有前缀的 urn:bccdx.ca

我想知道,如果我们可以添加多个命名空间,如何通过合同为生成的序列化消息 XML 添加前缀?我在网上看到了覆盖默认序列化程序的提示,但我宁愿不这样做。以前肯定已经考虑过并处理过这个问题吗?

0 投票
1 回答
192 浏览

c# - 使用 datacontract 上传图像以及 wcf 服务的用户 ID

我想使用 post、datacontract 将图像从 javascript 上传到 wcf 服务。我在谷歌上读到,使用数据契约是不可能的,它可以用消息契约来完成,因为当一个参数是流时,它不应该有任何其他参数。

但是在某些链接中提到可以通过在 querystring 中传递参数来完成。(例如:具有多平台支持的 WCF Restful 服务文件上传)我试过了,仍然收到错误说如果流作为参数存在,它不应该包含任何其他参数。但即使使用查询字符串也不可能吗?以下是我的代码