C# 飞行前请求返回404未在区域中找到控制器

C# 飞行前请求返回404未在区域中找到控制器,c#,asp.net-web-api,cors,asp.net-mvc-areas,preflight,C#,Asp.net Web Api,Cors,Asp.net Mvc Areas,Preflight,我有一个WebAPI项目,我通过以下步骤启用了CORS: 获取nuget软件包:安装软件包Microsoft.AspNet.WebApi.Cors 添加了config.EnableCors()至WebApiConfig.cs 在我的控制器中添加了[EnableCors(来源:“*”,标题:“*”,方法:“*”) 我的控制器位于根控制器文件夹中,并且在一个区域内 /Controllers/ValuesController /Areas/TestArea/Controllers/OtherStuff

我有一个WebAPI项目,我通过以下步骤启用了CORS:

  • 获取nuget软件包:
    安装软件包Microsoft.AspNet.WebApi.Cors
  • 添加了
    config.EnableCors()至WebApiConfig.cs
  • 在我的控制器中添加了
    [EnableCors(来源:“*”,标题:“*”,方法:“*”)
  • 我的控制器位于根控制器文件夹中,并且在一个区域内

    /Controllers/ValuesController
    /Areas/TestArea/Controllers/OtherStuffController
    
    两个控制器都具有
    [EnableCors(…)]
    属性

    我的问题是只有
    ValuesController
    起作用

    使用Fiddler检查对
    OtherStuffController
    的请求,我可以看到客户端发送了一个飞行前选项请求,但服务器的响应是404 not found而不是200 OK,然而
    ValuesController
    工作正常

    我做错了什么?为什么TestArea区域中的控制器不能处理CORS请求,而值控制器却可以

    除了名称之外,这两个控制器没有什么不同,它位于一个区域中

    /Controllers/ValuesController
    /Areas/TestArea/Controllers/OtherStuffController
    
    其他信息

    路线:

    // In WebApiConfig.cs
    config.Routes.MapHttpRoute("DefaultApi", "{controller}/{id}", 
        new {id = RouteParameter.Optional} );
    
    // In Areas/TestArea/TestAreaAreaRegistration.cs
    context.MapRoute("TestArea_default","TestArea/{controller}/{id}",
        new {id = UrlParameter.Optional});
    
    我用于访问操作方法的URL:

    http://localhxst:57578/values
    http://localhxst:57578/testarea/otherstuff
    
    值请求(工作):

    其次是:

    (REQUEST)
    GET http://localhxst:57578/values HTTP/1.1
    Host: localhost:57578
    User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0
    Accept: application/json
    Accept-Language: en-gb,en;q=0.5
    Accept-Encoding: gzip, deflate
    Authorization: Bearer HQkpyzeQ5NM1Va1Ow__6N6JzuRdMweDIJDneDQer1tL1uMhkrG4gsRYkXLQ1F4782L5vDTMOkoqvOEtO753n6TJ2BU-KNaxdXRAtf336c-r8MXMi_nWliw1vT1Xa7Wmt3eV5b9HmJR4Bnmt4gTavtoC0qwQVsoX_miV_VanJ98j_aaoNdNNZcnN5FsJ2eoLx7UebBDxXBMFmXEtOUTtWCsRp-g26mwKjbK3HeDoiUU2Ivh-VleUVImdh9ASwInbZ
    Referer: http://localhxst:12345/
    Origin: http://localhxst:12345
    Connection: keep-alive    
    
    (RESPONSE)
    HTTP/1.1 200 OK
    Cache-Control: no-cache
    Pragma: no-cache
    Content-Type: application/json; charset=utf-8
    Expires: -1
    Server: Microsoft-IIS/8.0
    Access-Control-Allow-Origin: *
    X-AspNet-Version: 4.0.30319
    X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcYmVuLmdvbGRlblxEb2N1bWVudHNcV29ya1xWb2ljZVNpbXBsaWZpZWRcQVBJXFZvaWNlU2ltcGxpZmllZC5QdWJsaWNBUElcdmFsdWVz?=
    X-Powered-By: ASP.NET
    Date: Thu, 24 Jul 2014 20:12:56 GMT
    Content-Length: 13
    
    ["ABC","DEF"]
    
    OtherStuff请求(预照明失败):

    
    找不到资源。
    正文{字体系列:“Verdana”;字体重量:正常;字体大小:.7em;颜色:黑色;}
    p{字体系列:“Verdana”;字体大小:正常;颜色:黑色;页边顶部:-5px}
    {字体系列:“Verdana”;字体大小:粗体;颜色:黑色;页边顶部:-5px}
    H1{字体系列:“Verdana”;字体重量:正常;字体大小:18pt;颜色:红色}
    H2{字体系列:“Verdana”;字体重量:正常;字体大小:14pt;颜色:褐红色}
    前{字体系列:“控制台”,“Lucida控制台”,单空格;字体大小:11pt;边距:0;填充:0.5em;线条高度:14pt}
    .marker{字体大小:粗体;颜色:黑色;文本装饰:无;}
    .version{color:gray;}
    .错误{页边距底部:10px;}
    .expandable{文本装饰:下划线;字体大小:粗体;颜色:海军蓝;光标:手;}
    @媒体屏幕和屏幕(最大宽度:639px){
    pre{width:440px;溢出:自动;空白:预换行;换行:断开单词;}
    }
    @媒体屏幕和屏幕(最大宽度:479px){
    前{宽度:280px;}
    }
    “/”应用程序中出现服务器错误。
    找不到资源。 描述:HTTP404。您正在查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。请检查以下URL并确保其拼写正确。

    请求的URL:/testrea/otherstuff

    版本信息:Microsoft.NET Framework版本:4.0.30319;ASP.NET版本:4.0.30319.34009
    ValuesController.cs

    名称空间MyAPIApp.PublicAPI.Controllers
    {
    [使能CORS(来源:“*”,标题:“*”,方法:“*”)
    [授权]
    公共类值控制器:ApiController
    {
    私有静态只读列表值=新列表{“ABC”,“DEF”};
    public IEnumerable Get(){返回值;}
    }
    }
    
    OtherStuffController.cs

    名称空间MyAPIApp.PublicAPI.Areas.TestArea.Controllers
    {
    [使能CORS(来源:“*”,标题:“*”,方法:“*”)
    [授权]
    公共类OtherStuffController:ApicController
    {
    私有静态只读列表值=新列表{“ABC”,“DEF”};
    public IEnumerable Get(){返回值;}
    }
    }
    
    我发现了问题

    通过“添加”>“区域”关联菜单在项目中创建区域时,Visual Studio使用以下代码创建具有区域注册模板的区域:

    public override void RegisterArea(AreaRegistrationContext context) {
        context.MapRoute(
            "TestArea_default",
            "TestArea/{controller}/{id}",
            new {id = UrlParameter.Optional}
            );
    }
    
    但是,此代码对于APIController不正确。正确的路线登记代码为:

    public override void RegisterArea(AreaRegistrationContext context) {
    
        context.Routes.MapHttpRoute(
            "TestArea_default", 
            "TestArea/{controller}/{id}", 
            new { id = RouteParameter.Optional });
    }
    

    原来这与CORS无关。

    我发现了问题所在

    通过“添加”>“区域”关联菜单在项目中创建区域时,Visual Studio使用以下代码创建具有区域注册模板的区域:

    public override void RegisterArea(AreaRegistrationContext context) {
        context.MapRoute(
            "TestArea_default",
            "TestArea/{controller}/{id}",
            new {id = UrlParameter.Optional}
            );
    }
    
    但是,此代码对于APIController不正确。正确的路线登记代码为:

    public override void RegisterArea(AreaRegistrationContext context) {
    
        context.Routes.MapHttpRoute(
            "TestArea_default", 
            "TestArea/{controller}/{id}", 
            new { id = RouteParameter.Optional });
    }
    

    原来这与CORS无关。

    你能发布你试图查询的URI吗,不包括域?。路由配置会有帮助。@Machinarius:添加了其他信息。你检查过TestAreaRegistration.cs被调用来注册它的路由了吗?也许你还想使用
    MapHttpRoute
    而不是
    MapRoute
    @Sabacc:Yep,MapHttpRoute vs MapRoute是个问题,谢谢。在将额外的信息添加到我的帖子中并同时查看两个路由定义后,我解决了这个问题。您可以发布您尝试查询的URI,而不是域吗?路由配置会有所帮助。@Machinarius:添加了额外的信息。您是否检查过调用TestAreaRegistration.cs来注册其路由?也许你还想使用
    MapHttpRoute
    而不是
    MapRoute
    @Sabacc:Yep,MapHttpRoute vs MapRoute是个问题,谢谢。我在我的帖子中添加了额外的信息,并同时看到了这两个路线定义之后,我就解决了这个问题。