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