ASP.NET Web Api在返回404时返回200 OK

我在ASP.NET Web API项目中的控制器上具有以下操作方法:

[Route("api/v2/project/{projectId}/stuff"), HttpGet]
public IHttpActionResult Get(int projectId)

[Route("api/v2/project/{projectId}/stuff/{id:guid}"), HttpGet]
public IHttpActionResult Get(int projectId, [FromUri] Guid id)

[Route("api/v2/project/{projectId}/stuff"), HttpPost]
public IHttpActionResult Post(int projectId, [Required] Stuff stuff)

[Route("api/v2/project/{projectId}/stuff/{id:guid}"), HttpPut]
public IHttpActionResult Put(int projectId, [FromUri] Guid blastId, Stuff stuff)

[Route("api/v2/project/{projectId}/stuff/{id:guid}"), HttpDelete]
public IHttpActionResult Delete(int projectId, [FromUri] Guid id)

由于javascript错误,我做了一个DELETE请求

api/v2/project/1234/stuff/undefined

即而不是ID的GUID ,我得到了字符串"undefined" 。 据我所知,这不应该匹配我的任何路线,而是404 Not found (甚至405 Method not allowed ),我得到了200 OK作为回应。

我在每个这些动作方法中设置了一个断点,并使用Fiddler重复请求,但没有一个断点被击中。 我也尝试从nuget安装WebApiRouteDebugger软件包,但我们正在使用一个自定义控制器工厂,它通过我们的DI容器将事情挂钩,所以我根本无法完成它。 我甚至尝试从我的一个全局注册过滤器中抛出以下异常:

throw new Exception(actionContext.ControllerContext.ControllerDescriptor.ControllerName +
" " + actionContext.ActionDescriptor.ActionName);

DELETE请求仍然通过200 OK (没有请求有效的URL似乎这样做)。

如何解决这个问题? 什么可能是根本原因?


在您的Global.asax.cs文件中您的protected void Application_Start(object sender, EventArgs e)是,添加以下内容:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
    }

所有的服务器请求应该通过这里。

如果不在那里添加这些使用。

using System.Web.Compilation;
using System.Reflection;

然后在开始请求呼叫中添加此代码以列出所有活动路由。

        string Items = "";
        IEnumerable<Assembly> Assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();

        foreach (Assembly FoundAssembly in Assemblies)
        {
            string AssemblyName = FoundAssembly.FullName;
            IEnumerable<TypeInfo> Types = FoundAssembly.DefinedTypes.Where(type => type != null && type.IsPublic && type.IsClass && !type.IsAbstract && typeof(ApiController).IsAssignableFrom(type));
            foreach (TypeInfo ControllerType in Types)
            {
                System.Web.Http.Controllers.ApiControllerActionSelector ApiControllerSelection = new System.Web.Http.Controllers.ApiControllerActionSelector();
                System.Web.Http.Controllers.HttpControllerDescriptor ApiDescriptor = new System.Web.Http.Controllers.HttpControllerDescriptor(new System.Web.Http.HttpConfiguration(), ControllerType.Name, ControllerType);
                ILookup<string, System.Web.Http.Controllers.HttpActionDescriptor> ApiMappings = ApiControllerSelection.GetActionMapping(ApiDescriptor);

                foreach (var Maps in ApiMappings)
                {
                    foreach (System.Web.Http.Controllers.HttpActionDescriptor Actions in Maps)
                    {
                        Items += "[ controller=" + ControllerType.Name + " action=" + ((System.Web.Http.Controllers.ReflectedHttpActionDescriptor)(Actions)).MethodInfo + "]";
                    }
                }
            }
        }

这将列出所有控制器及其签名。 如果您的URL不符合其中任何一项,您可能必须展开列表以包含非控制器路由。


我遇到过同样的问题。 在我的startup.cs中,我有这个方法

app.Run(async context =>
       {
           context.Response.ContentType = "text/plain";
           await context.Response.WriteAsync("My Api");
       });

这导致所有路由与字符串一起收到200响应。 我只想在启动时显示这个响应。 这是解决方案。

 app.MapWhen(ctx => ctx.Request.Path.Value == "/", StartupPage);

与同一个Startup类中的方法一起

  private void StartupPage(IAppBuilder app)
    {
        app.Run(async (context) =>
        {
            context.Response.ContentType = "text/plain";
            await context.Response.WriteAsync("My Api");
        });
    }

我只在基础URL上发出请求时才返回200 OK消息。


我不确定你的路由,但我认为你有一个不包含映射操作的路由:

api/v2/project/1234/stuff/undefined 

检查web api配置: api/{controller}[/{action}]/{id} 。 我想你可能会用你的行动(比如GET)进行另一个路线行动。

PS张贴您的路线配置更新答案。

链接地址: http://www.djcxy.com/p/83861.html

上一篇: ASP.NET Web Api returns 200 OK when it should return 404

下一篇: How do I check whether a jQuery element is in the DOM?