15

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

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

警告 9 自定义工具警告:无法导入 wsdl:portType 详细信息:运行 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 调用库项目,但我讨厌这样做,因为这是一个额外的步骤。有什么建议么?

4

4 回答 4

14

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

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

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

于 2012-09-28T12:32:38.290 回答
10

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

于 2012-09-06T15:33:31.763 回答
1

当我试图返回 aJObject作为端点结果时,我在编译时遇到了这个错误。

我通过使端点返回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') {
于 2013-10-01T11:38:42.307 回答
0

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

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

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

于 2012-07-18T16:48:36.480 回答