我尝试将服务引用添加到WCF服务,该服务驻留在ASP.NET MVC 4项目的同一解决方案中但失败了。我得到一个错误说:
自定义工具错误:无法为服务引用生成代码 '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调用库项目,但我讨厌这样做,因为这是一个额外的步骤。有什么建议吗?
答案 0 :(得分:14)
如果你想保留对Newtonsoft.Json的引用,你也可以将Newtonsoft.Json从程序集列表中删除,以检查数据交换的重用。
要执行此操作:右键单击服务引用,然后单击“配置服务引用...”
在“重用引用程序集中的类型”下,选择第二个选项以指定在哪些程序集中搜索重用类型并选择所有程序集但取消选中Newtonsoft.Json
答案 1 :(得分:10)
尝试从引用中删除Newtonsoft.Json并重新添加服务引用。
答案 2 :(得分:1)
在尝试返回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') {
答案 3 :(得分:0)
你真的想在一个任意深度的树中返回一个节点吗?
如果是这样,那么首先将其转换为字符串以获取JSon文本,而不是返回JToken。在客户端,您可以Jtoken.Parse(yourstring)
返回JToken。
如果没有,那么考虑传回Value<T>
并让序列化处理T。