APIで4つのテーブルを結合しようとしていますが、シリアル化エラーが発生し続けます。エンティティ/コンテキストファイルに4つのテーブルモデルとそれらの関係があり、以下のコードをGlobal.asaxファイルに追加しようとしました。私は循環参照の問題を持っていると思っていますが、実際に問題を理解していない、私が持っているところ、それを修正する方法があります。これが私の最初のAPIの試行であるので、私は何か助けていただければ幸いです。エンティティフレームワークのシリアル化エラー
グローバル
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
コントローラ
public class StaffAssignController : ApiController
{
private assignStaffEntities db = new assignStaffEntities();
// GET api/StaffAssign
public IQueryable<staff_info> Getstaff_info()
{
return db.staff_info;
}
// GET api/StaffAssign/5
[HttpGet]
public IHttpActionResult Getstaff_info(string id)
{
staff_info staff_info = db.staff_info.Find(id);
if (staff_info == null)
{
return NotFound();
}
Dictionary<string, object> dataContainer = new Dictionary<string, object>();
var assign = (from a in db.staff_group_assignment
join g in db.groups on a.group_id equals g.group_id
join tc in db.time_commitment on a.attuid equals tc.attuid
join s in db.staff_info on a.attuid equals s.attuid
select new { a.group_id, a.attuid, a.iterations, a.title, g.kick_off_date, g.end_date, g.milestone, g.topic, g.status, tc.commitment_start_date, tc.commitment_end_date, s.email, s.first_name, s.last_name });
var assignmentInfo = assign.ToArray();
for (var i = 0; i < assignmentInfo.Length; i++)
{
dataContainer.Add("attuid", assignmentInfo[i].attuid);
dataContainer.Add("firstName", assignmentInfo[i].first_name);
dataContainer.Add("lastName", assignmentInfo[i].last_name);
dataContainer.Add("email", assignmentInfo[i].email);
dataContainer.Add("commitStartDate", assignmentInfo[i].commitment_start_date);
dataContainer.Add("commitEndDate", assignmentInfo[i].end_date);
dataContainer.Add("topic", assignmentInfo[i].topic);
dataContainer.Add("groupId", assignmentInfo[i].group_id);
dataContainer.Add("numOfMilestones", assignmentInfo[i].milestone);
dataContainer.Add("title", assignmentInfo[i].title);
dataContainer.Add("staffIterations", assignmentInfo[i].iterations);
dataContainer.Add("kickOffDate", assignmentInfo[i].kick_off_date);
dataContainer.Add("endDate", assignmentInfo[i].end_date);
dataContainer.Add("groupStatus", assignmentInfo[i].status);
}
return Ok(dataContainer);
}
エラー
<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'.
</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace/>
<InnerException>
<ExceptionMessage>
Type 'System.Data.Entity.DynamicProxies.staff_info_486D5E50524E69EE7794DA605D95FD2D9B861D9FD9D12B6E6415A49FD7317333' with data contract name 'staff_info_486D5E50524E69EE7794DA605D95FD2D9B861D9FD9D12B6E6415A49FD7317333:http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies' is not expected. Consider using a DataContractResolver if you are using DataContractSerializer or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to the serializer.
</ExceptionMessage>
<ExceptionType>
System.Runtime.Serialization.SerializationException
</ExceptionType>
<StackTrace>
at System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeAndVerifyType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, Boolean verifyKnownType, RuntimeTypeHandle declaredTypeHandle, Type declaredType) at System.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, RuntimeTypeHandle declaredTypeHandle) at WriteArrayOfstaff_infoToXml(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.SerializeWithoutXsiType(DataContract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle declaredTypeHandle) 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) at System.Net.Http.Formatting.XmlMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__14.MoveNext()
</StackTrace>
</InnerException>
</Error>
質問に完全な誤りを追加してください。 –
エラー – user3902467
で更新しました 'GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);をglobal.asaxファイルに追加しようとしましたか? –