首页 > 解决方案 > Web api 路由在 asp.net MVC 5 中失败

问题描述

我有一个带有大量控制器和 Web api 的 asp.net MVC 5 项目。问题是当我想访问其中一种 api 方法时,我得到No HTTP resource was found that match the request URI ...错误。

我在类似的帖子中尝试了所有解决方案,但我并不幸运。这是我的 RouteConfig 文件:

public static void Register(HttpConfiguration config)
{
    // Routing configs
    config.MapHttpAttributeRoutes();

    // Files api routs
    config.Routes.MapHttpRoute(
        name: "filesApi_1",
        routeTemplate: "api/{controller}/{action}/{file}",
        defaults: new object[]
        {
            new { controller = "Files", action ="SaveAttachment"}
        }
     );

config.Routes.MapHttpRoute(
    name: "filesApi_2",
    routeTemplate: "api/{controller}/{action}/{fileName}",
    defaults:
        new { controller = "Files", action = "DeleteAttachment" }
    );
}

当我转到 htt://localhost:xxxx/api/Files/DeleteAttachment/file_name 时,我收到错误消息。

我的 Global.asax.cs 是:

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        GlobalConfiguration.Configure(WebApiConfig.Register); 
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        Mapper.Initialize(c=> c.AddProfile<MappingProfile>());
    }

控制器是:

public class FilesController : ApiController
{
    public void SaveAttachment(HttpPostedFileBase file){}
    public void DeleteAttachment(string fileName){}
}

很奇怪,如果我为 web api 操作添加属性路由,它们会按预期工作。例如:

[Route("api/Files/DeleteAttachment/{fileName}")]
public void DeleteAttachment(string fileName){}

我不想为每个动作都写 Route,因为我有很多动作,这会使代码变得脆弱。如何修复路由表中的路由?谢谢。

标签: c#asp.net-web-apirouting

解决方案


您必须检查文件名。如果文件 url 即将到来或文件名中的值包含“/”,它将拆分路由并创建一个新的 url

htt://localhost:xxxx/api/Files/DeleteAttachment/file_name_before_slash/file_name_after_slash

它与您的 URL 不匹配。

检查代码文件名部分的值。

-------------------- 编辑 1 ----------------- --------

问题可能出在文件名“file.jpg”中。文件名中的点 (.) 导致问题参考此链接,更多类似问题可用。还要检查这个

尝试

 <configuration>
     <system.web>
         <httpRuntime relaxedUrlToFileSystemMapping="true"/>

          <!-- ... your other settings ... -->
     </system.web>
 </configuration>

推荐阅读