Маршрутизация атрибутов WebApi для URL-адресов с *.js

Хорошо, это не такой смешной конец...

Я пытаюсь эмулировать службу на основе RoR в .Net WebAPI. Предполагается, что реализация службы Ruby возвращает документ JSON из URL-адреса:

http://myserver/api/assessments/{id}.js

Обратите внимание на .js в конце.

Я сделал украшение RouteAttribute на своем API-контроллере следующим образом:

[Route("~/api/assessments/{id}.js")]
public async Task<HttpResponseMessage> GetAssessment(int id)
{
    . . .
}

... но я получаю ошибку 404. Я подозревал, что это могло быть связано с тем, что запрос заканчивался на «js», поэтому после небольшого исследования я обнаружил, что должен установить для RouteCollection.RouteExistingFiles значение true... похоже, это не имело никакого эффекта. Я все еще получаю 404.

Я прав? является ли окончание .js причиной ошибки 404? Как я могу обойти это? Это чистый проект WebApi, поэтому я все равно не использую в нем JavaScript.


person Jeremy Holovacs    schedule 09.04.2015    source источник
comment
Это может вам помочь stackoverflow.com/questions/11494200/ Прочтите раздел об ограничениях.   -  person Praveen Paulose    schedule 09.04.2015
comment
Есть ли причина, по которой вам нужно сохранить это расширение на конечной точке службы? Это никогда не должно быть необходимо в веб-API, поскольку вы можете согласовать содержимое для возврата JSON.   -  person David L    schedule 09.04.2015
comment
[Route(~/api/assessments/{id:int}.js)] и в вашей конфигурации для параметра runAllManagedModulesForAllRequests должно быть установлено значение true.   -  person Praveen Paulose    schedule 09.04.2015
comment
Ну, как я уже сказал, я пытаюсь эмулировать службу из RoR... это то, чего ожидает служба.   -  person Jeremy Holovacs    schedule 09.04.2015
comment
Отладчик маршрута может быть очень полезен: haacked.com/archive /2008/03/13/url-routing-debugger.aspx Я предлагаю опубликовать эти результаты   -  person AaronLS    schedule 09.04.2015


Ответы (1)


У вас есть следующее в вашем Web.config? Недавно я только что настроил маршрутизацию для проекта для работы, и эта строка вызвала у меня все виды ада, потому что ее не было:

<configuration>
  ...
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
    ...
    </modules>
  </system.webServer>
</configuration>

Расширение .js может не подхватываться управляемыми модулями, выполняющими маршрутизацию.

Приложение: Дополнительные данные, которые находятся в этом разделе конфигурации и необходимы для его работы:

<configuration>
  ...
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="UrlRoutingModule"
         type="System.Web.Routing.UrlRoutingModule, 
               System.Web.Routing, Version=3.5.0.0, 
               Culture=neutral, 
               PublicKeyToken=31BF3856AD364E35" />
    </modules>
    <handlers>
      <add name="UrlRoutingHandler"
        preCondition="integratedMode"
        verb="*" path="UrlRouting.axd"
        type="System.Web.HttpForbiddenHandler, 
              System.Web, Version=2.0.0.0, Culture=neutral, 
              PublicKeyToken=b03f5f7f11d50a3a" />
    </handlers>
    ...
  </system.webServer>
</configuration>
person Der Kommissar    schedule 09.04.2015
comment
Стоит отметить, что runAllManagedModulesForAllRequests может повлиять на производительность вашего приложения. - person David L; 09.04.2015
comment
хм... похоже, это не имеет значения. - person Jeremy Holovacs; 09.04.2015
comment
Это очень верно, это может быть значительной альтернативой вместо сопоставления файлов .js в IIS для запуска через модули ASP.NET. - person Der Kommissar; 09.04.2015
comment
Вы заменили существующую линейку ‹modules›? (или добавить в тег свойство runAllManagedModulesForAllRequests=true?) Я пропустил из него закрывающий тег в исходном ответе, но это не однострочный тег. - person Der Kommissar; 09.04.2015
comment
Нет, у меня уже был тег модулей, поэтому я просто добавил атрибут. - person Jeremy Holovacs; 09.04.2015
comment
Хорошо, вы гарантировали (с помощью точек останова), что 404 - это серверная часть IIS, а не прикладная? - person Der Kommissar; 09.04.2015
comment
nvm, как только я переработал свой экземпляр IIS Express, это сработало. Спасибо! - person Jeremy Holovacs; 09.04.2015
comment
Нет проблем, приятель, рад, что смог помочь. :) - person Der Kommissar; 09.04.2015