【问题标题】:OData v4 Action conflict with MVC 404 not found未找到与 MVC 404 的 OData v4 操作冲突
【发布时间】:2014-10-21 07:15:18
【问题描述】:

当我升级到 Odata v4 时,现在在 v3 中工作的所有操作都会出现 404 not found 错误:

[HttpException]: The controller for path /odata/MyModel/CheckStatus was not found or does not implement IController.
at System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType)
at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName)
at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

我的代码如下:

WebApiConfig:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
...
config.MapODataServiceRoute(
    routeName: "OData",
    routePrefix: "odata",
    model: GetModel(),
    batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));

    config.AddODataQueryFilter();

获取模型:

builder.EntityType<MyModel>().Collection.
Action("CheckStatus").Parameter<IEnumerable<EntityStatus<MyModel>>>("modelStatus");
...

ODataController:

public async Task<IHttpActionResult> CheckStatus([FromBody] IEnumerable<EntityStatus<MyModel>> modelStatus)
...

其中 EntityStatus 是一个通用类,如下所示:

public class EntityStatus<T> where T : class
{
    [Key, Column(Order = 0)]
    public string Status { get; set; }

    [Key, Column(Order = 1)]
    public string Original { get; set; }

    public T Model { get; set; }
}

在 Ajax 调用中:

var url = "/odata/MyModel/CheckStatus";
$.ajax({
    url: url,
    ...

我尝试添加命名空间,修改 web.config 并使用OdataRoute,但均未成功。你能帮我绕过上面显示的这些错误吗?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 odata asp.net-web-api2


    【解决方案1】:

    要解决所有 OData 4 操作“404 未找到”错误,只需将 Web.config 中的模块部分替换为以下内容:

    <modules runAllManagedModulesForAllRequests="true"></modules>
    

    我在某处读到这不是一个好的解决方案。幸运的是,它现在可以工作了。

    如果您与我分享您对此解决方案的经验,我会很高兴。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 2018-03-18
      • 2017-03-23
      • 1970-01-01
      • 2021-08-06
      • 2018-11-20
      • 2013-04-07
      相关资源
      最近更新 更多