Ошибка добавления ссылки на службу: Тип - это рекурсивный контракт с данными сбора, который не поддерживается

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

Ошибка пользовательского инструмента: не удалось создать код для ссылки на службу 'XXX'. Дополнительные сведения см. В других сообщениях об ошибках и предупреждениях. корневое предупреждение:

Предупреждение 9 Предупреждение о настраиваемом инструменте: невозможно импортировать wsdl: portType Detail: исключение было брошено при запуске расширения импорта WSDL: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Ошибка: Тип "Newtonsoft.Json.Linq.JToken" - это рекурсивная коллекция которые не поддерживаются. Рассмотрите возможность изменения определение коллекции 'Newtonsoft.Json.Linq.JToken' для удаления ссылки на себя. XPath to Error Источник: //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, но я не хочу этого делать, поскольку это дополнительный шаг. Любые предложения?

Ответы

Ответ 1

Если вы хотите сохранить ссылку на Newtonsoft.Json, вы также можете оставить Newtonsoft.Json из списка сборок, чтобы проверить повторное использование datacontracts.

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

В разделе "Типы повторного использования в ссылочных сборках" выберите второй вариант, чтобы указать, в каких сборках искать повторно используемые типы и выбирать все сборки, но снимите флажок Newtonsoft.Json

Ответ 2

Попробуйте удалить Newtonsoft.Json из своих ссылок и повторно добавить ссылку на службу.

Ответ 3

У меня была эта ошибка во время компиляции при попытке вернуть 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') {

Ответ 4

Вы действительно хотите вернуть node в произвольно глубокое дерево?

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

Если нет, то рассмотрите вопрос о возврате Value<T> и о разрешении сериализации с T.