2012-07-18 35 views
15

我試圖將服務引用添加到與ASP.NET MVC 4項目駐留在同一解決方案中但失敗的WCF服務。我有一個錯誤說:添加服務引用時出錯:類型是不支持的遞歸集合數據合同

Custom tool error: Failed to generate code for the service reference 'XXX'. Please check other error and warning messages for details. The root warning is:

Warning 9 Custom tool warning: Cannot import wsdl:portType Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Error: Type 'Newtonsoft.Json.Linq.JToken' is a recursive collection data contract which is not supported. Consider modifying the definition of collection 'Newtonsoft.Json.Linq.JToken' to remove references to itself. XPath to Error Source: //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

我的答案可能是完全關閉基地...你可以包括你的問題的數據合同? – 2012-07-18 16:49:32

回答

0

你真的想要在一棵任意深的樹中返回一個節點嗎?

如果是這樣,那麼代替返回一個JToken,首先將它轉換爲一個字符串來獲取JSon文本。在客戶端,您可以將Jtoken.Parse(yourstring)重新放回JToken中。

如果沒有,再考慮回傳Value<T>,讓序列化處理T.

10

嘗試從引用刪除Newtonsoft.Json和重新添加服務引用。

+4

爲我工作。回想起來,將Service Reference配置爲「在引用的程序集中重用類型」可能就足夠了 – TheXenocide 2012-09-07 21:50:32

14

如果您想要保留對Newtonsoft.Json的引用,您還可以將Newtonsoft.Json從程序集列表中刪除,以檢查是否重用了datacontracts。

要做到這一點:右鍵單擊您的服務引用,然後單擊配置服務引用...

在「重用類型的引用程序」,選擇在其中指定第二個選項組件搜索重用類型和選擇所有程序集,但取消選中Newtonsoft.Json

+1

如果您有沒有服務引用的WCF服務,該怎麼辦?你將如何配置重用的類型? – user145400 2015-03-20 16:44:47

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') { 
相關問題