添加服务引用时出错:类型是不支持的递归集合数据协定

Posted

技术标签:

【中文标题】添加服务引用时出错:类型是不支持的递归集合数据协定【英文标题】:Error adding service reference: Type is a recursive collection data contract which is not supported 【发布时间】:2012-07-17 13:08:20 【问题描述】:

我尝试将服务引用添加到驻留在 ASP.NET MVC 4 项目的同一解决方案中的 WCF 服务,但失败了。我收到一条错误消息:

自定义工具错误:无法为服务参考生成代码 'XXX'。有关详细信息,请查看其他错误和警告消息。这 根警告是:

警告 9 自定义工具警告:无法导入 wsdl:portType 详细信息:An 运行 WSDL 导入扩展时引发异常: System.ServiceModel.Description.DataContractSerializerMessageContractImporter 错误:类型“Newtonsoft.Json.Linq.JToken”是递归集合 不支持的数据合同。考虑修改 要删除的集合“Newtonsoft.Json.Linq.JToken”的定义 对自身的引用。错误源的 XPath: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='IXXX'] C:\Projects...\Reference.svcmap 1 1 pqrt.web

如果我从服务合同中删除数据合同,它就会起作用。我还尝试将服务引用添加到其他项目,如库项目甚至 ASP.NET MVC 3 项目,这一切都奏效了。我想知道这是否是 ASP.NET MVC 4 的问题?我使用的是 VS 2012 RC。

我能想到的一种解决方法是将服务引用添加到库项目,然后从 ASP.NET MVC 4 调用库项目,但我讨厌这样做,因为这是一个额外的步骤。有什么建议吗?

【问题讨论】:

我的回答可能完全不符合标准...您可以在问题中包含数据合同吗? 【参考方案1】:

您真的要返回任意深度树中的节点吗?

如果是这样,那么首先将其转换为字符串以获取 JSon 文本,而不是返回 JToken。在客户端,您可以Jtoken.Parse(yourstring) 回一个 JToken。

如果没有,则考虑回传Value<T> 并让序列化处理 T。

【讨论】:

【参考方案2】:

尝试从您的引用中删除 Newtonsoft.Json 并重新添加您的服务引用。

【讨论】:

为我工作。回想起来,将服务引用配置为不“在引用的程序集中重用类型”也可能就足够了【参考方案3】:

如果您想保留对 Newtonsoft.Json 的引用,您也可以将 Newtonsoft.Json 从程序集列表中删除,以检查数据合同的重用。

为此:右键单击您的服务引用,然后单击配置服务引用...

在“在引用的程序集中重用类型”下选择第二个选项以指定在哪些程序集中搜索重用类型并选择所有程序集但取消选中 Newtonsoft.Json

【讨论】:

如果您有一个没有服务引用的 WCF 服务怎么办?您将如何配置要重用的类型?【参考方案4】:

我在编译时尝试返回 JObject 作为端点结果时遇到此错误。

我通过让端点返回 object 并使用这种代码来解决它:

[WebGet(UriTemplate = "SomeRequest?form_request=form_request", ResponseFormat = WebMessageFormat.Json)]
public object SomeRequest(string form_request)

    dynamic result = new JObject();
    // some other code
    result.status = "success";
    return JsonConvert.SerializeObject(result);

jQuery 通过 jsonp 使用服务,例如$.getJSON('<?>.svc/SomeRequest', 'form_request=' + webform_as_json, request_callback); 然后像这样解压序列化的对象:

function request_callback(response) 
    var json = $.parseJSON(response);
    if (json.status == 'success') 

【讨论】:

以上是关于添加服务引用时出错:类型是不支持的递归集合数据协定的主要内容,如果未能解决你的问题,请参考以下文章

哪种列表/集合类型最适合在 WCF 数据协定中使用?

使用稍微复杂的方法引用 WCF 服务时获取“递归集合数据契约”

ASP.NET Web Api 和数据协定

引用相同数据协定的多个 WCF 服务

WebService 错误:无法加载协定为xxx的终结点配置部分,因为找到了该协定的多个终结点配置

运行所选代码生成器时出错:“预期具有协定名称 "NuGet.VisualStudio.IVsPackageInstallerServices" 的1导出 ——VS2015错误记录