【问题标题】:Returning an [Out] array of struct in WCF function在 WCF 函数中返回结构的 [Out] 数组
【发布时间】:2017-07-11 10:13:44
【问题描述】:

我在返回一个结构数组时遇到问题,而一个简单的结构可以完美地工作。服务器端:

[OperationContract] long GetPapers([Out] array<PAPER_INFO>^% PaperInfo); -- FAIL
[OperationContract] long GetPaper([Out] PAPER_INFO% PaperInfo); -- SUCCESS

客户端:

[OperationContract] long GetPapers(out PAPER_INFO[] PaperInfo); -- FAIL
[OperationContract] long GetPaper(out PAPER_INFO PaperInfo); -- SUCCESS

失败的意思是没有错误信息,只是一个空数组进来。结构很简单,只使用简单的类型,序列化没有问题。

[StructLayout(LayoutKind::Sequential, Pack = 1)]
public value struct PAPER_INFO {
  unsigned int PaperWidth;
  unsigned int PaperLength;
};

登录服务器并使用 WCF 测试客户端进行测试清楚地表明数组已填充、发送回,因此问题出在客户端,数据的反序列化。尽管上面的结构本身应该作为推断数据协定工作,但我也尝试使用DataContractDataMember 属性对其进行装饰,而在行为上没有任何区别。已知类型用于不同目的,但我也尝试过,以防万一,也没有区别。

什么会使数组而不是结构本身有问题?

【问题讨论】:

  • 不应该有array&lt;PAPER_INFO%&gt;^ 而不是array&lt;PAPER_INFO&gt;^% 吗?
  • 编译器不这么认为:“cli::array 的元素类型必须是句柄或值类型”。
  • 所以这个 PAPER_INFO 是你的 cli 类型?然后试试array&lt;PAPER_INFO^&gt;^?
  • 那时我还看不到如何填充它。但是给一个明确的值结构加个帽子?
  • 不,这根本不是 C++ 方面。毕竟,这是一个数据合同问题。

标签: c# arrays wcf struct c++-cli


【解决方案1】:

毕竟这是一个数据合同问题。我不知道为什么,因为推断的合同应该可以正常工作,无论如何它需要一个明确的名称:

[StructLayout(LayoutKind::Sequential, Pack = 1)]
[DataContract(Name = "PAPER_INFO")]
public value struct PAPER_INFO {
  [DataMember] unsigned int PaperWidth;
  [DataMember] unsigned int PaperLength;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 2019-05-06
    • 2018-08-06
    • 1970-01-01
    • 2020-05-31
    • 2016-12-09
    • 2018-03-12
    相关资源
    最近更新 更多