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