2012-07-18 25 views
15

Tôi đã cố gắng thêm tham chiếu dịch vụ vào dịch vụ WCF nằm trong cùng một giải pháp từ dự án ASP.NET MVC 4 nhưng không thành công. Tôi gặp lỗi khi nói:Lỗi thêm tham chiếu dịch vụ: Loại là hợp đồng dữ liệu thu thập đệ quy không được hỗ trợ

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

Nếu tôi xóa hợp đồng dữ liệu khỏi hợp đồng dịch vụ, nó đã hoạt động. Tôi cũng đã cố gắng thêm tham chiếu dịch vụ cho các dự án khác như dự án thư viện hoặc thậm chí là dự án ASP.NET MVC 3, tất cả đều hoạt động. Tôi đã tự hỏi nếu đây là một vấn đề với ASP.NET MVC 4? Tôi đã sử dụng RC 2012 RC.

Một cách giải quyết khác mà tôi có thể nghĩ là thêm tham chiếu dịch vụ vào dự án thư viện và sau đó gọi dự án thư viện từ ASP.NET MVC 4, nhưng tôi ghét làm điều đó vì đó là bước bổ sung. Bất kỳ đề xuất?

+0

Câu trả lời của tôi có thể hoàn toàn không chính xác ... bạn có thể đưa vào hợp đồng dữ liệu với câu hỏi của mình không? –

Trả lời

0

Bạn có thực sự muốn quay lại một nút trong cây sâu tùy ý không?

Nếu có, sau đó thay vì trả lại JToken, trước tiên hãy chuyển đổi nó thành chuỗi để lấy văn bản JSon. Ở cuối ứng dụng khách, bạn có thể Jtoken.Parse(yourstring) quay lại JToken.

Nếu không, sau đó xem xét đi qua phía sau Value<T> và cho phép thỏa thuận serialization với T.

10

Hãy thử loại bỏ Newtonsoft.Json từ tài liệu tham khảo của bạn và thêm lại tài liệu tham khảo dịch vụ của bạn.

+4

Làm việc cho tôi. Nhìn lại, cũng có thể đủ để cấu hình Tham chiếu dịch vụ không phải là "Sử dụng lại các loại trong hội đồng được tham chiếu" – TheXenocide

14

Nếu bạn muốn giữ tham chiếu đến Newtonsoft.Json bạn cũng có thể để Newtonsoft.Json ra khỏi danh sách các hội đồng để kiểm tra việc sử dụng lại các datacontracts.

Để làm điều này: nhấp chuột phải tham khảo dịch vụ của bạn, sau đó nhấp vào Configure dịch vụ tham khảo ...

Dưới "loại tái sử dụng trong hội đồng tham chiếu" chọn tùy chọn thứ hai để xác định, trong đó hội để tìm kiếm các loại tái sử dụng và chọn tất cả các hội đồng nhưng bỏ chọn Newtonsoft.Json

+1

Nếu bạn có dịch vụ WCF không có tham chiếu dịch vụ thì sao? Bạn sẽ định cấu hình loại nào để sử dụng lại? – user145400

1

Tôi đã gặp lỗi này lúc biên dịch khi cố gắng trả về kết quả điểm cuối là JObject.

tôi xung quanh nó bằng cách làm cho sự trở lại endpoint object và có loại mã này:

[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); 
} 

Các jQuery tiêu thụ các dịch vụ thông qua jsonp ví dụ $.getJSON('<?>.svc/SomeRequest', 'form_request=' + webform_as_json, request_callback); sau đó mở gói đối tượng được tuần tự hóa như sau:

function request_callback(response) { 
    var json = $.parseJSON(response); 
    if (json.status == 'success') { 
Các vấn đề liên quan