我在我的TabController.cs中實體化了一個DashboardActions.cs的實體,它應該回傳一個來自Entity Framework的IEnumerable<Tab>/code>。我展示了TabController.cs的GET方法和控制器實體化的DashboardActions.cs類的GetTabs方法的代碼。Tab是我EF模型中的一個物體。下面是完整的錯誤資訊:
<錯誤>
<Message>發生了一個錯誤。</Message>
<ExceptionMessage> 'ObjectContent`1'型別未能序列化回應體為內容型別'application/xml; charset=utf-8'.</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace/>
<InnerException>
<Message>發生了一個錯誤。</Message>
<ExceptionMessage>型別'System.Data.Entity.DynamicProxies. Tab_3CD81772060539EC79CB677CA17899B90117059EFFC0976D087CA8B0FBE38520' with資料合同名稱 'Tab_3CD81772060539EC79CB677CA17899B90117059EFFC0976D087CA8B0FBE38520。 http://schemas。 datacontract.org/2004/07/System.Data.Entity.DynamicProxies' 是 不是預期。考慮使用DataContractResolver 如果你正在使用DataContractSerializer 或 添加任何型別不靜態地知道到已知型別串列中 - for 例如。通過 使用 KnownTypeAttribute屬性 或 通過將它們添加到傳遞給序列化器的已知型別串列中。 </ExceptionMessage>
<ExceptionType>System.Runtime.Serialization.SerializationException</ExceptionType>
在System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType)處。 Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithXsiType(XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle objectTypeHandle, Type objectType, Int32 declaredTypeID, RuntimeTypeHandle declaredTypeHandle, Type declaredType) at System. Runtime.Serialization.XmlObjectSerializerWriteContext. InternalSerialize(XmlWriterDelegator xmlWriter, Object obj, Boolean isDeclaredType, Boolean writeXsiType, Int32 declaredTypeID, at WriteArrayOfTabToXml(XmlWriterDelegator , Object , XmlObjectSerializerWriteContext , CollectionDataContract) at System. Runtime.Serialization.CollectionDataContract.WriteXmlValue(XmlWriterDelegator xmlWriter, Object obj, XmlObjectSerializerWriteContext context) at System.Runtime.Serialization。 XmlObjectSerializerWriteContext.WriteDataContractValue(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) at System. Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType) at System. Runtime.Serialization.XmlObjectSerializerWriteContext. SerializeWithXsiTypeAtTopLevel(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle originalDeclaredTypeHandle, Type graphType) at System.Runtime.Serialization.DataContractSerializer。 InternalWriteObjectContent(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer. InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer. WriteObjectHandleExceptions(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver) at System.Runtime. Serialization.DataContractSerializer.WriteObject(XmlWriter writer, Object graph) at System.Net.Http.Formatting.XmlMediaTypeFormatter. WriteToStream(Type type, Object value, Stream writeStream, HttpContent content) 在 System.Net.Http.Formatting.XmlMediaTypeFormatter. WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancelToken) ---堆疊跟蹤結束 從先前的位置例外被拋出 ---在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()在System.Runtime.CompilerServices。 TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.WebHost。 HttpControllerHandler.<WriteBufferedResponseContentAsync>d__22.MoveNext()</StackTrace>
</InnerException>
</Error>
TabController.cs
public IEnumerable< Tab> GetTabs()
{
IEnumerable<Tab> recentPages = null;
try try
{
using (var context = new Clarity.BusinessLayer.CLARITY_DNN()
{
recentPages = (from t in context.Tabs
join tp in context.TabPermissions on t.TabID equals tp.TabID
where tp.RoleID == -1 && tp.AllowAccess && tp.PermissionID == 3 !
&& !t.IsDeleted && t.IsVisible && t.PortalID == 0 & &
!string.IsNullOrEmpty(t.Description)
&& t.TabName != "Home".
select t)
.OrderByDescending(p => p.LastModifiedOnDate ? ? p.CreatedOnDate)
.Take(20) 。
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
return recentPages。
}
TabController.cs
public class TabController : ApiController
{
// GET: 儀表板
public IEnumerable<Tab> Get()
{
var recentTabsInstance = new DashboardActions()。
var recentTabs = recentTabsInstance.GetTabs();
return recentTabs;
}
我試著用KnownType裝飾器來改變控制器的動作,但無濟于事:
public class TabController : ApiController
{
[]
[] 。
// GET: 儀表板
public IEnumerable<Tab> Get()
{
var recentTabsInstance = new DashboardActions()。
var recentTabs = recentTabsInstance.GetTabs();
return recentTabs;
}
它一直說KnownType只能用于類、結構等,但DashboardActions是一個類。如果有任何幫助,我們將不勝感激。
uj5u.com熱心網友回復:
最后一個錯誤意味著KnownType屬性只能應用于一個類,在你的例子中,你把它應用于Get()方法。但讓我們忘了這一點吧。
根本問題是如何將KnownType屬性應用于類,而在你的例子中,你將其應用于Get()方法。
根本問題在于 Entity Framework 的作業方式,以及這如何混淆了資料合約層。簡單的解決方案是不直接回傳 Entity Framework 物件,而是將值復制到視圖模型類中并將其作為結果回傳。
因為在內部,EF創建了額外的型別來保存這些值。這些看起來像你定義的類,但它們是不一樣的。
在這種情況下,EF創建了System.Data.Entity.DynamicProxies.Tab_3CD81772060539EC79CB677CA17899B90117059EFFC0976D087CA8B0FBE38520型別來實作Tab類。DataContracts層并不認識這個類。(誰能呢?說實話。)
因此,我的解決方案將是實作 Tab 類。
因此,我的解決方案是創建一個TabModel類,并在查詢中的select t)
新類:
public class TabModel
{
public int TabID { get; set; }
public DateTime LastModifiedOnDate { get; set; }
public DateTime CreatedOnDate{ get; set; }
//其他你需要的屬性。。
現在改變查詢以回傳這種型別的物件,而不是EF物件本身。像這樣結束查詢:
select new TabModel()
{
TabID = t.TabID,
LastModifiedOnDate = t.LastModifiedOnDate,
CreatedOnDate= t.CreatedOnDate。
//其他屬性。
})
.OrderByDescending(p => p.LastModifiedOnDate ? ? p.CreatedOnDate)
.Take(20)。
別忘了把IEnumerable<Tab> GetTabs()的簽名改為IEnumerable<TabModel> GetTabs()
現在TabController干凈多了,因為它沒有向外界暴露EF物件,而資料構造層可以處理一個漂亮而簡單的TabModel物件。此外,如果資料模型在未來的版本中需要改變,網路界面可以保持不變。這在未來改變這段代碼時提供了很大的靈活性。
uj5u.com熱心網友回復:
System.Data.Entity.DynamicProxies.Tab_3CD81772060539EC79CB677CA17899B90117059EFFC0976D087CA8B0FBE38520
這是一個針對你的物體的懶惰加載代理包裝器。 所以要關閉該控制器的懶惰加載。 請看:
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/309869.html
標籤:
