Hoffentlich macht der Titel Sinn, ich werde mein Bestes geben, um mein Problem zu beschreiben.Ungeladene "eifrig geladene" Eigenschaften, die Probleme bei der Rückgabe von Json-Daten verursachen
Ich entwickle gerade eine ASP.NET Web API. In meinem "Company" -Controller habe ich eine GetCompany() -Aktion.
/// <summary>
/// Gets the 'Authorization-Token' request header and finds the company with the
/// matching decrypted token from the database, returns it; if null, returns 404
/// </summary>
/// <returns>Matching company for token passed in request or 404 if null</returns>
[HttpGet][ResponseType(typeof(Company))]
[Route("api/company/")]
public HttpResponseMessage GetCompany() {
string token = Request.Headers.GetValues("Authorization-Token").First();
ICollection<Company> companies;
Company c;
using (BaseRepository r = new BaseRepository()) {
companies = r.Get<Company>(null, null, null);
c = companies.Where(cm => RSA.Decrypt(cm.Token) == token).FirstOrDefault<Company>();
}
if (c == null)
return Request.CreateResponse(HttpStatusCode.NotFound, c);
return Request.CreateResponse(HttpStatusCode.OK, c);
}
Dies findet es und gibt es ganz gut, aber wenn ich diese Prüfung bin, die Antwort, die ich sehe, ist
{
"Message": "An error has occurred.",
"ExceptionMessage": "The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; charset=utf-8'.",
"ExceptionType": "System.InvalidOperationException",
"StackTrace": null,
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "Error getting value from 'Locations' on 'System.Data.Entity.DynamicProxies.Company_40636FF93138F09772BEA689D3A3D3AB7DBB41AFF7FE3D0BEFF55FC7C1D10E0F'.",
"ExceptionType": "Newtonsoft.Json.JsonSerializationException",
"StackTrace": " at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.CalculatePropertyValues(JsonWriter writer, Object value, JsonContainerContract contract, JsonProperty member, JsonProperty property, JsonContract& memberContract, Object& memberValue)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)\r\n at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)\r\n at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value)\r\n at System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content)\r\n at System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n at System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__14.MoveNext()",
"InnerException": {
"Message": "An error has occurred.",
"ExceptionMessage": "The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.",
"ExceptionType": "System.ObjectDisposedException",
"StackTrace": " at System.Data.Entity.Core.Objects.ObjectContext.get_Connection()\r\n at System.Data.Entity.Core.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)\r\n at System.Data.Entity.Core.Objects.ObjectQuery`1.Execute(MergeOption mergeOption)\r\n at System.Data.Entity.Core.Objects.DataClasses.EntityCollection`1.Load(List`1 collection, MergeOption mergeOption)\r\n at System.Data.Entity.Core.Objects.DataClasses.EntityCollection`1.Load(MergeOption mergeOption)\r\n at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.Load()\r\n at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.DeferredLoad()\r\n at System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior.LoadProperty[TItem](TItem propertyValue, String relationshipName, String targetRoleName, Boolean mustBeNull, Object wrapperObject)\r\n at System.Data.Entity.Core.Objects.Internal.LazyLoadBehavior.<>c__DisplayClass7`2.<GetInterceptorDelegate>b__1(TProxy proxy, TItem item)\r\n at System.Data.Entity.DynamicProxies.Company_40636FF93138F09772BEA689D3A3D3AB7DBB41AFF7FE3D0BEFF55FC7C1D10E0F.get_Locations()\r\n at GetLocations(Object)\r\n at Newtonsoft.Json.Serialization.DynamicValueProvider.GetValue(Object target)"
}
}
}
Ich verstehe das Problem ist, dass meine Eigenschaften sind eifrig geladen und sie werden nie geladen. Ich kann es sagen, um meine Navigationseigenschaften innerhalb meines Company
Objekts ziemlich leicht zu laden. Das Problem, auf das ich stoße, wenn ich das tue, ist, dass es sagt, dass die komplexen Objekte innerhalb der oben erwähnten Navigationseigenschaften ebenfalls null sind und ich sie nicht so einfach eifrig laden kann; ich will es auch nicht. Es versucht also, den ganzen "Objektbaum" zu laden, weil es keinen besseren Weg gibt, es zu sagen (was ich mir vorstellen kann).
Also meine Frage ist, was ist der beste Weg, um dies zu umgehen?
Dank serialisiert werden! Im Moment fahre ich nach Hause, aber ich werde das überprüfen, wenn ich kann! –
Arbeitete wie ein Zauber, machte dies in der OnModelCreating zuvor mit 'base.Configuration. *' Vor, aber es in den Konstruktor meines Kontexts verschieben löste es. –
Ich wollte nur auf diese erweitern, manchmal wollen Sie nicht zum eifrigen Laden wegen der Auswirkungen auf die Leistung ändern, die es haben könnte, wenn Sie Ihre (schweren) Objekte anderswo verwenden. Wenn dies der Fall ist, ziehen Sie in Betracht, das träge Objekt in ein anderes Objekt (z. B. ein ViewModel) zu verpacken und nur die Eigenschaften zu evaluieren, die Sie stattdessen benötigen. – Marcus