【问题标题】:C# net core Odata web api json format exceptionC# net core Odata web api json格式异常
【发布时间】:2021-04-21 15:30:49
【问题描述】:

我想从 C# net 5 web api 返回一个包含复杂对象集合的实体(“Question5Point1”)。 我的问题是,我的 json 结果在复杂对象的开头被剪切。 它看起来像这样:

我的元数据如下所示:

我的代码是这样的:

结果是:

每个字段/属性都已填写。 为什么会发生此错误,我该怎么办? 在调试的输出中,我看到了这个异常:

    Microsoft.OData.ODataException: An internal error 'EdmLibraryExtensions_ToTypeReference' occurred.
   at Microsoft.OData.Metadata.EdmLibraryExtensions.ToTypeReference(IEdmType type, Boolean nullable)
   at Microsoft.OData.Metadata.EdmLibraryExtensions.ToTypeReference(IEdmType type)
   at Microsoft.OData.TypeNameOracle.ResolveAndValidateTypeFromTypeName(IEdmModel model, IEdmStructuredType expectedType, String typeName, IWriterValidator writerValidator)
   at Microsoft.OData.ODataWriterCore.GetResourceType(ODataResourceBase resource)
   at Microsoft.OData.ODataWriterCore.ValidateResourceForResourceSet(ODataResourceBase resource, ResourceBaseScope resourceScope)
   at Microsoft.OData.ODataWriterCore.<>c__DisplayClass121_0.<WriteStartResourceImplementation>b__0()
   at Microsoft.OData.ODataWriterCore.InterceptException(Action action)
   at Microsoft.OData.ODataWriterCore.WriteStartResourceImplementation(ODataResource resource)
   at Microsoft.OData.ODataWriterCore.<>c__DisplayClass49_0.<WriteStartAsync>b__0()
   at Microsoft.OData.TaskUtils.GetTaskForSynchronousOperation(Action synchronousOperation)
--- End of stack trace from previous location ---
   at Microsoft.AspNet.OData.Formatter.Serialization.ODataResourceSerializer.WriteResourceAsync(Object graph, ODataWriter writer, ODataSerializerContext writeContext, IEdmTypeReference expectedType)
   at Microsoft.AspNet.OData.Formatter.Serialization.ODataResourceSetSerializer.WriteResourceSetAsync(IEnumerable enumerable, IEdmTypeReference resourceSetType, ODataWriter writer, ODataSerializerContext writeContext)
   at Microsoft.AspNet.OData.Formatter.Serialization.ODataResourceSerializer.WriteComplexAndExpandedNavigationPropertyAsync(IEdmProperty edmProperty, SelectItem selectItem, ResourceContext resourceContext, ODataWriter writer)
   at Microsoft.AspNet.OData.Formatter.Serialization.ODataResourceSerializer.WriteComplexPropertiesAsync(SelectExpandNode selectExpandNode, ResourceContext resourceContext, ODataWriter writer)
   at Microsoft.AspNet.OData.Formatter.Serialization.ODataResourceSerializer.WriteResourceAsync(Object graph, ODataWriter writer, ODataSerializerContext writeContext, IEdmTypeReference expectedType)
   at Microsoft.AspNet.OData.Formatter.Serialization.ODataResourceSerializer.WriteObjectAsync(Object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext)
   at Microsoft.AspNet.OData.Formatter.ODataOutputFormatterHelper.WriteToStreamAsync(Type type, Object value, IEdmModel model, ODataVersion version, Uri baseAddress, MediaTypeHeaderValue contentType, IWebApiUrlHelper internaUrlHelper, IWebApiRequestMessage internalRequest, IWebApiHeaders internalRequestHeaders, Func`2 getODataMessageWrapper, Func`2 getEdmTypeSerializer, Func`2 getODataPayloadSerializer, Func`1 getODataSerializerContext)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|29_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
   at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNet.OData.Batch.ODataBatchMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Server.IIS.Core.IISHttpContextOfT`1.ProcessRequestAsync()

【问题讨论】:

  • 你找出错误的原因了吗?缺少视图模型?

标签: c# visual-studio rest asp.net-core entity-framework-core


【解决方案1】:

我在导航属性列表中遇到了同样的问题,请确保您的 Key(s) 是唯一的,我在 Key 中有 null,因此 json 已被剪切。

【讨论】:

    【解决方案2】:

    当我有两个 OData 控制器返回两个不同的数据类型时发生了这个错误,这些数据类型包含一个具有相同名称的内部类:

    public class OEntity
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        ...
        public Day[] Days { get; set; }
    
        // Daily information related to this entity
        public class Day
        {
            public DateTime Date { get; set; }
            public double Deposit { get; set; }
            ...
        }
    }
    
    public class OCost
    {
        [Key]
        public int Id { get; set; }
        public double TotalCost { get; set; }
        public string Currency { get; set; }
        ...
        public Day[] Days { get; set; }
    
        // Causes "internal error 'EdmLibraryExtensions_ToTypeReference'" 
        // in the OEntity controller. Must rename!
        public class Day
        {
            public DateTime Date { get; set; }
            public double Cost { get; set; }
        }
    }
    

    所以请确保您的所有数据类都没有相同的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-04
      • 1970-01-01
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      相关资源
      最近更新 更多