Сбой маршрутизации веб-API в asp.net MVC 5 - PullRequest
0 голосов
/ 26 июня 2018

У меня есть проект asp.net MVC 5 с большим количеством контроллеров и веб-интерфейсом.Проблема в том, что когда я хочу получить доступ к одному из методов API, я получаю Не найден ресурс HTTP, который соответствует 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, я получаю сообщение об ошибке.

My Global.asax.cs is:

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){}
}

Очень странно, что если я добавлю маршрутизацию атрибутов для действий веб-API, они будут работать как положено.Например:

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

Я не хочу писать Route для каждого действия, потому что у меня много действий, и это делает код хрупким.Как я могу исправить маршрутизацию в таблице маршрутов?Спасибо.

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Пометьте методы контроллера Api атрибутами [HttpGet] или [HttpPost], чтобы механизм маршрутизации знал, когда их использовать.

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

----------------------------------------------------------------------------------И вторая проблема может быть связана со значениями маршрутизации по умолчанию:

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

В маршруте по умолчанию отсутствует параметр fileName, поэтому измените его на:

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

или

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

----------------------------------------------------------------------------------Хорошо, если он все еще не работает, это связано с именем файла, содержащим ..Веб-API-маршрутизация не любит точки в последнем параметре.Измените свой URL с http://localhost:58893/api/files/deleteattachment/file.jpgвhttp://localhost:58893/api/files/deleteattachment/file.jpg/и вы должны иметь возможность вызывать запрошенный метод

0 голосов
/ 26 июня 2018

Обычная маршрутизация следует за маршрутизацией на основе шаблонов, которую вы настраиваете в webApiConfig, но маршрутизация по атрибутам намного более гибкая.Я согласен, что вы, возможно, не захотите писать атрибут [Route] для каждого метода, но позже он обеспечивает большую гибкость.

В одном из моих проектов я мог бы использовать один и тот же контроллер, чтобы иметь разные API-интерфейсы маршрутов, обслуживающие сходную функциональностьи по просьбе команды разработчиков пользовательского интерфейса. См. эту статью

0 голосов
/ 26 июня 2018

Вы должны проверить имя файла.Если файл URL идет или значение в имени файла содержит '/', он разделит маршрут и создаст новый URL как

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

Он не будет соответствовать вашему URL.

Проверьте значение в части имени файла вашего кода.

------------------- Редактировать 1 ------------------------------------

Проблема может быть в файле с именем файла.JPG».Точка (.) В имени файла вызывает проблему , обратитесь к этой ссылке , доступны другие похожие вопросы. Также отметьте это .

try

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

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