ASP.NET WebAPI OData 406
本文关键字:OData WebAPI NET ASP | 更新日期: 2023-09-27 18:30:55
我在让一个相当简单的OData WebAPI服务工作时遇到了问题。在 ~/和 ~/$metadata 上的元数据查询之外,检查我自己的实体集会返回 406。调试控制器时(见下文),GET请求被路由,数据库被查询,数据被实际返回。但是,之后仍会生成 406。
预期的响应是一个格式正确的 JSON 响应字符串,在查询 ~/Crop 时显示所有数据行。
请注意,其中一些对我来说仍然是黑魔法,所以请随时详细说明任何回应。这是接线:
全球
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; }
}
作物控制器(节选):
public class CropsController : ODataController
{
private ParadiseDataContext db = new ParadiseDataContext();
// GET: odata/Crops
[EnableQuery]
public IQueryable<Crop> GetCrops()
{
return db.Crops;
}
查询网址和结果:
家:
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 包配置应还原依赖项。
我想出了问题所在:
再次是模型(现在是完整代码)
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"