Вопрос по wcf, .net, wsdl, exception-handling, service-reference – Ошибка при добавлении ссылки на службу: тип - это контракт данных рекурсивного сбора, который не поддерживается

15

Я попытался добавить ссылку на службу в службу WCF, которая находится в том же решении из проекта ASP.NET MVC 4, но не удалось. Я получил сообщение об ошибке:

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, но я ненавижу это делать, поскольку это дополнительный шаг. Какие-либо предложения?

Мой ответ может быть совершенно неосновательным ... Можете ли вы включить договор о данных с вашим вопросом? Michael Hays

Ваш Ответ

4   ответа
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') {
0

Если это так, то вместо возврата JToken сначала преобразуйте его в строку, чтобы получить текст JSon. На стороне клиента вы можетеJtoken.Parse(yourstring) обратно в JToken.

Если нет, то рассмотрите возможность передачи обратноValue<T> и позволить сериализации иметь дело с Т.

10

ссылку на сервис.

Работал на меня. Оглядываясь назад, может также быть достаточно сконфигурировать ссылку на службу, чтобы не «повторно использовать типы в ссылочных сборках»;
14

вы также можете исключить Newtonsoft.Json из списка сборок, чтобы проверить возможность повторного использования контрактов данных.

Для этого: щелкните правой кнопкой мыши ссылку на службу, затем нажмите «Настройка справки службы» ...

Под & quot; Повторное использование типов в ссылочных сборках & quot; выберите второй вариант, чтобы указать, в каких сборках искать повторно используемые типы, и выбрать все сборки, но снять флажок Newtonsoft.Json

Что делать, если у вас есть служба WCF без ссылки на службу? Как бы вы настроили, какие типы использовать повторно?

Похожие вопросы