【发布时间】:2017-05-17 02:42:07
【问题描述】:
我正在尝试使用以下控制器返回 JSON 对象:
public async Task<IHttpActionResult> Get(string query)
{
var client = new HttpClient(new HttpClientHandler()
{
Credentials = new NetworkCredential("myuser", "NotSoSecret#1", "mydomain"),
});
var ipAddress = Dns.GetHostAddresses("myorgetc.com").ToList()[0];
client.BaseAddress = new Uri(string.Format("http://{0}/myorg/api/data/v8.1/", ipAddress.ToString()));
HttpResponseMessage response = await client.GetAsync(client.BaseAddress +"accounts"+ query);
object result;
if (response.IsSuccessStatusCode)
{
result = await response.Content.ReadAsAsync<object>();
return Ok(result);
}
return NotFound();
}
它返回以下异常:
此 XML 文件似乎没有关联任何样式信息 用它。文档树如下所示。一个错误 已经发生了。类型 'Newtonsoft.Json.Linq.JToken' 是一个递归收集数据合约 不支持。考虑修改定义 集合 'Newtonsoft.Json.Linq.JToken' 以删除对 本身。 System.Runtime.Serialization.InvalidDataContractException 在 System.Runtime.Serialization.DataContract.ValidatePreviousCollectionTypes(类型 collectionType, Type itemType, Dictionary
2 previousCollectionTypes) at System.Runtime.Serialization.DataContract.GetNonDCTypeStableName(Type type, Dictionary2 previousCollectionTypes) at System.Runtime.Serialization.DataContract.GetStableName(类型类型, Dictionary2 previousCollectionTypes, Boolean& hasDataContract) at System.Runtime.Serialization.DataContract.GetDefaultStableLocalName(Type type) at System.Runtime.Serialization.DataContract.GetDCTypeStableName(Type type, DataContractAttribute dataContractAttribute) at System.Runtime.Serialization.DataContract.GetStableName(Type type, Dictionary2 previousCollectionTypes, Boolean& hasDataContract) at System.Runtime.Serialization.DataContract.GetCollectionStableName(类型 type, Type itemType, Dictionary`2 previousCollectionTypes, CollectionDataContractAttribute&collectionContractAttribute) 在 System.Runtime.Serialization.CollectionDataContract.CollectionDataContractCriticalHelper..ctor(类型 类型、CollectionKind 种类、类型 itemType、MethodInfo getEnumeratorMethod,字符串 serializationExceptionMessage,字符串 反序列化异常消息)在 System.Runtime.Serialization.CollectionDataContract.CollectionDataContractCriticalHelper..ctor(类型 类型、CollectionKind 种类、类型 itemType、MethodInfo getEnumeratorMethod、MethodInfo addMethod、ConstructorInfo 构造函数)在 System.Runtime.Serialization.CollectionDataContract..ctor(类型类型, CollectionKind 种类,类型 itemType,MethodInfo getEnumeratorMethod, MethodInfo addMethod, ConstructorInfo 构造函数, Boolean isConstructorCheckRequired) 在 System.Runtime.Serialization.CollectionDataContract.IsCollectionOrTryCreate(类型 type, Boolean tryCreate, DataContract& dataContract, Type& itemType, Boolean constructorRequired, Boolean skipIfReadOnlyContract) at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.CreateDataContract(Int32 id, RuntimeTypeHandle typeHandle, Type type) at System.Runtime.Serialization.DataContract.DataContractCriticalHelper.GetDataContractSkipValidation(Int32 id, RuntimeTypeHandle typeHandle, Type type) at System.Runtime.Serialization.DataContractSerializer.GetDataContract(DataContract 声明类型合同,类型声明类型,类型对象类型)在 System.Runtime.Serialization.DataContractSerializer.InternalWriteObjectContent(XmlWriterDelegator 作家,对象图,DataContractResolver dataContractResolver)在 System.Runtime.Serialization.DataContractSerializer.InternalWriteObject(XmlWriterDelegator 作家,对象图,DataContractResolver dataContractResolver)在 System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDelegator 作家,对象图,DataContractResolver dataContractResolver)在 System.Runtime.Serialization.DataContractSerializer.WriteObject(XmlWriter 作家,对象图)在 System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStream(类型 类型、对象值、流 writeStream、HttpContent 内容)在 System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStreamAsync(类型 类型、对象值、流 writeStream、HttpContent 内容、 TransportContext transportContext, CancellationToken cancelToken) --- 从上一个位置结束堆栈跟踪,其中 抛出异常---在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Web.Http.Owin.HttpMessageHandlerAdapter.d__13.MoveNext()
我做错了什么?如何在开发时不知道确切结构的情况下返回 JSON 对象?
这是我的启动:
public static class Startup
{
// This code configures Web API. The Startup class is specified as a type
// parameter in the WebApp.Start method.
public static void ConfigureApp(IAppBuilder appBuilder)
{
// Configure Web API for self-host.
HttpConfiguration config = new HttpConfiguration();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var container = new UnityContainer();
container.RegisterType<IAccountsRepository, AccountsRepository>(new HierarchicalLifetimeManager());
container.RegisterType<IAccountService, AccountService>(new HierarchicalLifetimeManager());
config.DependencyResolver = new UnityResolver(container);
appBuilder.UseWebApi(config);
}
}
【问题讨论】:
-
试试这个:
return Ok(JsonConvert.SerializeObject(result, Formatting.Indented))。JsonConvert对象位于Newtonsoft.Json命名空间中,因此您可能需要添加引用和/或 using 语句。
标签: c# .net json asp.net-web-api visual-studio-2017