.net web api不会以json格式返回
我在web api中有一个名为vote的控制器,这是一个post请求,从主体中获取一些参数,如果成功,它应该返回投票者的id,或者如果他以前投票过,则返回已经投票的id。对于第二种情况,我是对的。但是当用户投票成功时,我得到了这个错误.net web api不会以json格式返回,.net,json,vb.net,entity-framework,asp.net-web-api,.net,Json,Vb.net,Entity Framework,Asp.net Web Api,我在web api中有一个名为vote的控制器,这是一个post请求,从主体中获取一些参数,如果成功,它应该返回投票者的id,或者如果他以前投票过,则返回已经投票的id。对于第二种情况,我是对的。但是当用户投票成功时,我得到了这个错误 { "message": "An error has occurred.", "exceptionMessage": "The 'ObjectContent`1' type failed to serialize the response body for
{
"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 while copying content to a stream.",
"exceptionType": "System.Net.Http.HttpRequestException",
"stackTrace": " at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__1b.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.ReleaseConnection()\r\n at System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.Finally()\r\n at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, 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 System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)\r\n at System.Net.Http.Formatting.JsonMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, Encoding effectiveEncoding)\r\n at System.Net.Http.Formatting.BaseJsonMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext, CancellationToken cancellationToken)"
}
}
}
这是控制器
Namespace Controllers
Public Class VoteController
Inherits ApiController
Function Post(<FromBody> ByVal user As Voting) As HttpResponseMessage
Try
Using entities As ElectionsEntities = New ElectionsEntities()
Dim entity = entities.Votings.FirstOrDefault(Function(e) e.Elector_FK_ID = user.Elector_FK_ID)
If entity Is Nothing Then
Dim message = Request.CreateResponse(HttpStatusCode.Created, entities.SP_Voting_Insert(user.Elector_FK_ID, user.City_FK_ID, user.Voting_Center_FK_ID, user.class_FK_ID))
message.Headers.Location = New Uri(Request.RequestUri, user.Elector_FK_ID.ToString())
Return message
Else
Dim message = Request.CreateResponse(HttpStatusCode.BadRequest, "هذا الشخص قام بالتصويت")
Return message
End If
End Using
Catch e As Exception
Return Request.CreateErrorResponse(HttpStatusCode.BadRequest, e)
End Try
End Function
End Class
End Namespace
任何帮助都将不胜感激,
提前感谢内部异常看起来与实体框架相关。通常情况下,上下文已被处理。。。EF中的错误与。您确定正在立即执行您使用范围内的所有内容吗?我特别关注entities.SP_Voting_Insert方法。我只能推断它的作用,但您可能需要确保它立即执行,而不是在处理对象上下文之后执行
本应作为评论发布,但唉。。。我还没有权限。SP工作正常,通过它将用户添加到数据库的方式,但它会提示该错误,但我需要返回没有任何错误的响应嗯。。。用户创建方法SP_Voting_Insert是否包含处理对象上下文的代码?我更新了问题,添加了SP im,看一看,可能是SELECT@@IDENTITY查询在处理对象上下文后才执行。您能够使用断点进行调试吗?我会尝试将SP_Voting_Insert的结果存储在一个变量中并检查它,或者您可以尝试调用SP_Voting_Insert.ToString或类似的方法来强制执行。对不起,我的建议含糊不清-我有EF的经验,但不是VB.NET。
Namespace Controllers
Public Class VoteController
Inherits ApiController
Function Post(<FromBody> ByVal user As Voting) As HttpResponseMessage
Try
Using entities As ElectionsEntities = New ElectionsEntities()
Dim entity = entities.Votings.FirstOrDefault(Function(e) e.Elector_FK_ID = user.Elector_FK_ID)
If entity Is Nothing Then
Dim message = Request.CreateResponse(HttpStatusCode.Created, entities.SP_Voting_Insert(user.Elector_FK_ID, user.City_FK_ID, user.Voting_Center_FK_ID, user.class_FK_ID))
message.Headers.Location = New Uri(Request.RequestUri, user.Elector_FK_ID.ToString())
Return message
Else
Dim message = Request.CreateResponse(HttpStatusCode.BadRequest, "هذا الشخص قام بالتصويت")
Return message
End If
End Using
Catch e As Exception
Return Request.CreateErrorResponse(HttpStatusCode.BadRequest, e)
End Try
End Function
End Class
End Namespace
@Elector_FK_ID bigint,
@City_FK_ID bigint,
@Voting_Center_FK_ID bigint,
@class_FK_ID as bigint
AS
BEGIN
SET NOCOUNT ON;
insert into [Elections].[dbo].[Voting]
(
[Elector_FK_ID],[VoteDate],[City_FK_ID],[Voting_Center_FK_ID],[class_FK_ID]
)
values
(
@Elector_FK_ID,getdate(),@City_FK_ID,@Voting_Center_FK_ID,@class_FK_ID
)
select @@IDENTITY