2014-04-15 15 views
8

Hy vọng rằng tiêu đề có ý nghĩa, tôi sẽ cố gắng hết sức để mô tả vấn đề của mình.Các thuộc tính "tải xuống" đã tải xuống gây ra sự cố khi trả lại dữ liệu json'd

Tôi hiện đang phát triển ASP.NET Web API. Trong bộ điều khiển "Công ty" của tôi, tôi có một hành động GetCompany().

/// <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); 
    } 

này tìm nó và trả về nó chỉ tốt, tuy nhiên khi tôi đang thử nghiệm này, phản ứng tôi thấy là

{ 
    "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)" 
     } 
    } 
} 

Tôi hiểu vấn đề là tài sản của tôi rất háo hức được nạp và họ không bao giờ được tải. Tôi có thể nói nó tải các thuộc tính điều hướng của tôi bên trong đối tượng Company của tôi khá dễ dàng. Vấn đề tôi gặp phải khi tôi làm điều đó, là nó nói rằng các đối tượng phức tạp bên trong các thuộc tính dẫn hướng nói trên là null và tôi không thể dễ dàng mong muốn tải chúng; tôi cũng không muốn. Vì vậy, nó đang cố gắng để tải toàn bộ "cây đối tượng" vì thiếu một cách tốt hơn để nói nó (mà tôi có thể nghĩ đến).

Câu hỏi của tôi là, cách tốt nhất để giải quyết vấn đề này là gì?

Trả lời

11

Proxy đang khiến trình nối tiếp cố gắng truy cập các thuộc tính điều hướng không còn khả dụng kể từ ngữ cảnh đã được xử lý.

Hãy thử loại bỏ các proxy và tải háo hức từ ngữ cảnh của bạn khi bạn đang truy vấn cho các đối tượng đó sẽ được tuần tự

context.Configuration.ProxyCreationEnabled = false; 
context.Configuration.LazyLoadingEnabled = false; 
+0

Cảm ơn! Lái xe về nhà vào lúc này nhưng tôi sẽ kiểm tra điều này khi tôi có thể! –

+0

Làm việc như một sự quyến rũ, đã làm điều này trong OnModelCreating trước đây bằng cách nói 'base.Configuration. *' Trước đó nhưng chuyển nó đến hàm tạo của ngữ cảnh của tôi đã giải quyết nó. –

+0

Tôi chỉ muốn mở rộng về điều này, đôi khi bạn không muốn thay đổi để tải háo hức vì những tác động hiệu quả nó có thể có nếu bạn sử dụng (nặng) các đối tượng của bạn ở nơi khác. Nếu trường hợp này xảy ra, hãy xem xét gói đối tượng lười vào đối tượng khác (ví dụ: một ViewModel) và chỉ đánh giá các thuộc tính bạn cần thay thế. – Marcus

Các vấn đề liên quan