netcore3.1odata返回错误500

q3aa0525  于 2021-08-01  发布在  Java
关注(0)|答案(1)|浏览(308)

我目前正在.NETCore3.1中开发一个ODataAPI,它从SQLServer获取数据。使用postman,我将get请求发送到带有accept头text/xml和application/json的api。
使用此url:http://localhost:8008/odata/contact?$filter=no_ueq't20-1234567'&$select=no和应用程序/json接受头(或无接受头)响应为
json响应
但对于accept header application/xml或text/xml:
应用程序引发了未处理的异常。system.argumentexception:类型为'system.linq.enumerablequery'的对象 1[Microsoft.AspNet.OData.Query.Expressions.SelectExpandBinder+SelectSome “1[models.contact]]”无法转换为类型“system.collections.generic.ienumerable”“1[models.contact]]”。
奇怪的是,当从url中删除$select部分时,应用程序正确地处理了请求(200)。
我的控制器操作:

[HttpGet]
    [ODataRoute(nameof(Contact))]
    public IQueryable<Contact> GetContact()
    {
        return _context.Contact;
    }

有人见过这种行为吗?

cgh8pdjw

cgh8pdjw1#

为了回答我自己的问题,这里有一个可能的解决方法:

services
        .AddMvc(config =>
            {
                ...
                config.OutputFormatters.Add(new CustomXmlOutputFormatter());
                config.RespectBrowserAcceptHeader = true;
            });
public class CustomXmlOutputFormatter : TextOutputFormatter
    {
        public CustomXmlOutputFormatter()
        {
            SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/xml"));
            SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("text/xml"));

            SupportedEncodings.Add(Encoding.UTF8);
            SupportedEncodings.Add(Encoding.Unicode);
        }

        protected override bool CanWriteType(Type type)
        {
            return true;
        }

        public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
        {
            if (context == null) throw new ArgumentNullException(nameof(context));
            if (selectedEncoding == null) throw new ArgumentNullException(nameof(selectedEncoding));

            var httpContext = context.HttpContext;

            var json = JsonConvert.SerializeObject(new { item = context.Object });

            var xml = JsonConvert.DeserializeXNode(json, "root");

            var buffer = new StringBuilder(xml.ToString());

            await httpContext.Response.WriteAsync(buffer.ToString());
        }
    }

相关问题