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

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

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

Предупреждение 9 Предупреждение о пользовательском инструменте: невозможно импортировать wsdl:portType Подробно: возникла исключительная ситуация при запуске расширения импорта 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, но я ненавижу это делать, поскольку это дополнительный шаг. Какие-либо предложения?

4 ответа

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

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

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

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

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

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

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

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

Другие вопросы по тегам