Как я могу переопределить файл .svc в моей таблице маршрутизации? - PullRequest
33 голосов
/ 08 сентября 2010

У меня есть этот URL, который использовался из некоторого поста JSON с основного сайта:

http://site/Services/api.svc/UpdateItem

Мы находимся в процессе медленного обновления сайта до ASP.NetMVC 2 и не хочу ломать любые текущие URL в системе.(Проблемы с обновлением JavaScript)

Я удалил /Services/api.svc и переместил логику для этого вызова API в следующий контроллер:

http://site/LegacyApi/UpdateItem

К сожалению, при добавлении маршрута я не могу заставить его переопределить api.svc и постоянно получать ошибку 404.

Маршрут:

    routes.MapRoute(
        "UpdateItemApi",
        "Services/api.svc/UpdateItem",
        new { controller = "LegacyApi", action = "UpdateItem" }
    );

Согласно MSDN по этой конкретной проблеме , маршрутизация должна пройти.

Любая помощь по этому вопросу очень приветствуется.


Обновление

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

Ответы [ 2 ]

38 голосов
/ 08 сентября 2010

Проблема, с которой вы столкнулись, связана с поставщиком сборок, который зарегистрирован для файлов .svc. Этот поставщик сборок зарегистрирован в файле web.config уровня машины по умолчанию.

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

  <system.web>
    <compilation debug="true" targetFramework="4.0">
        <buildProviders>
            <remove extension=".svc"/>            
        </buildProviders>
    ...
4 голосов
/ 08 сентября 2010

Используя перезаписи URL, я смог сделать то, что эта ссылка предложила , только в обратном направлении:

  <system.webServer>
    <rewrite>
      <rules>
        <rule name="LegacyApiService" stopProcessing="true">
          <match url="^Services/api.svc/(.*)$" />
          <action type="Rewrite" url="LegacyApi/{R:1}" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
...