Asp.net mvc 4 使用MVC4+时收到406状态代码错误;奥达塔+;可质疑
在MVC4和.NET4上,我只能使用最简单的OData场景。Asp.net mvc 4 使用MVC4+时收到406状态代码错误;奥达塔+;可质疑,asp.net-mvc-4,asp.net-web-api,odata,iqueryable,http-status-code-406,Asp.net Mvc 4,Asp.net Web Api,Odata,Iqueryable,Http Status Code 406,在MVC4和.NET4上,我只能使用最简单的OData场景。 这是我的WebApiConfig文件: config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); builder.EntitySet<Client>("Cl
这是我的WebApiConfig文件:
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Client>("Client");
config.Routes.MapODataRoute(
routeName: "odataapi",
routePrefix: "api",
model: builder.GetEdmModel()
);
config.EnableQuerySupport();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.EnableQuerySupport();
config.EnableSystemDiagnosticsTracing();
config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling =
Newtonsoft.Json.PreserveReferencesHandling.All;
dbcontext是常规EF6上下文。当我执行请求时,我收到406个错误。
我检查了所有可用的信息,没有发现它不起作用的原因。
可能是OData从MVC5开始工作,而在MVC4中它仍然太多了
public class {EntitySetName}Controller : ODataController
{
// ...
}
从模型生成器中选择以下内容:
builder.EntitySet<Client>("Client");
但是从跟踪中,您的请求uri是:Url=[some\u link]/api/ODataGrid
它与上述odata路线不匹配,而是与您的第二条路线匹配:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
虽然它可以路由和调用“Get”方法,但是“DefaultApi”路由不能序列化从“Get”方法返回的结果。所以,答案是“406”删除maphttroute(…)调用
将请求发送为:Url=[some_link]/api/Client
config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
我改变了一切没有,一切都解决了。
这也是一个问题:
builder.EntitySet<Client>("Client");
builder.EntitySet(“客户端”);
您在WebApiConfig和您的控制器中使用了哪些OData名称空间?下面是#2
描述的,我(1)将OData路由更改为完全不同的门,因为路由前缀:“OData”
(2)使用/OData/Client
,效果非常好。从odata返回406不是问题,而是从webapi路由返回。而且,请始终注意,odata是区分大小写的。
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
config.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
builder.EntitySet<Client>("Client");