ASP.NET WebAPI OData 406

3
我有一个问题,无法让一个相当简单的OData WebAPI服务正常工作。除了在~/和~/$metadata上进行元数据查询外,检查自己的实体集返回406。在调试控制器(见下文)时,GET请求被路由,数据库被查询并且实际返回数据。然而,在此之后仍会生成406错误。
期望的响应是一个正确格式化的JSON响应字符串,显示查询~/Crops时所有数据行。
请注意,其中一些对我来说仍然是黑魔法,所以请随意详细说明任何响应。这是连线:
Global.asax
public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
}

WebApiConfig:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.AddODataQueryFilter();
        ODataModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<Crop>("Crops");
        var model = builder.GetEdmModel();

        config.MapODataServiceRoute(
            routeName: "odata",
            routePrefix: null,
            model: model);
    }
}

作物模型:

public class Crop
{
    [Key]
    public int CropId { get; set; }
    [Required]
    public string Name { get; set; }
    public int MinCost { get; set; }
    public int DefaultCost { get; set; }
    public int MaxCost { get; set; }
}

CropsController(摘录):
public class CropsController : ODataController
{
    private ParadiseDataContext db = new ParadiseDataContext();

    // GET: odata/Crops
    [EnableQuery]
    public IQueryable<Crop> GetCrops()
    {
        return db.Crops;
    }

查询URL和结果:

首页:

http://localhost:39086/
{
  "@odata.context":"http://localhost:39086/$metadata","value":[
    {
      "name":"Crops","kind":"EntitySet","url":"Crops"
    }
  ]
}

查询作物

http://localhost:39086/Crops
406 - Not Accepted (Empty Body)

项目文件:https://www.dropbox.com/s/5k62xl8bdfbzgq7/ParadiseBayDataService.zip?dl=0 所有二进制文件已删除,所有VSSO引用已删除。 Nuget包配置应恢复依赖项。


我以最基本的方式查询它(还没有超出这个范围),使用~/Crops进行查询,可以让我在代码的GetCrops部分中到达我的断点。我通过结果查看器验证了db.Crops实际上返回数据。 - AlexR
可能是WebAPI和ODataController返回406 Not Available的重复问题。 - Orif Khodjaev
以下是有关编程的内容:以及有关406 http错误的更多信息https://dev59.com/WWYq5IYBdhLWcg3wui4z - Marvin Smit
以上两个线程似乎都不适用于我的情况:第一个似乎涉及到一些缺失的路由。我认为它正在使用不同版本的OData,因为答案中指示的设置不可用。使用其他项目修改代码没有产生不同的结果。Marvin的线程表明客户端不接受application/json:我在fiddler上创建了以下接受标头进行测试:Accept: text/html,application/xhtml+xml,application/xml,application/json,text/plain;q=0.9;image/webp,/;q=0.8; 结果相同。 - AlexR
除了你提到的odata路由前缀“odata”没有在你的代码中使用之外,你列出的所有内容看起来都很好。然而,这不是根本原因。 请问你能否分享一个repo项目给我(控制台应用程序也可以)? - Sam Xu
显示剩余2条评论
1个回答

0

我找到了问题所在:

再次附上模型(现在是完整代码)

using System.Data;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Threading.Tasks;
using System.Web.Http;
using System.Web.Http.OData;
using ParadiseBayDataService.Models;

namespace ParadiseBayDataService.Controllers
{
    [EnableQuery]
    public class CropsController : ODataController

    {
        private ParadiseDataContext db = new ParadiseDataContext();

        // GET: odata/Crops
        [EnableQuery]
        public IQueryable<Crop> GetCrops()
        {
            return db.Crops;
        }

需要注意的是这一行代码:


using System.Web.Http.OData;

当我将这个更改为:

using System.Web.OData;

它按预期工作。我看到了一个引用相同事物的链接。但是问题的答案更像是“使用System.Web.OData”,没有太多上下文。我通过回到基础并遵循指南来解决这个问题。那个工作示例和我所拥有的唯一的主要区别就是这一行。路由在调试过程中没有给你太多线索,关键似乎在于“EnableQuery”。


很高兴你解决了这个问题,但这不是我的问题,我在所有地方都使用System.Web.OData; :( - Worthy7
当我实现自定义操作时,我收到了一个406错误。从我的ODataController返回给客户端的对象与我在创建模型时指定的操作.Returns<T>中指定的类型不同。 - Scope Creep

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接