如何覆盖路由表中的.svc文件?

时间:2010-09-07 20:41:47

标签: c# asp.net-mvc-2 url-routing

我有一个从主网站发回的一些JSON帖子中使用的URL:

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

我们正在慢慢更新网站到ASP.Net MVC 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 on this specific issue,路由应该通过。

非常感谢任何帮助。


更新

标准.aspx页面的路由按预期工作,因此这似乎与.svc文件及其处理方式有关。

2 个答案:

答案 0 :(得分:38)

您遇到的问题是由于.svc文件注册的构建提供程序。此构建提供程序由默认的机器级web.config文件注册。

为了在这种情况下使路由工作,您需要在应用程序的web.config文件中删除构建提供程序。以下代码段显示了如何从构建提供程序列表中删除.svc扩展名。

  <system.web>
    <compilation debug="true" targetFramework="4.0">
        <buildProviders>
            <remove extension=".svc"/>            
        </buildProviders>
    ...

答案 1 :(得分:4)

使用URL重写我能够执行this link suggested,只能向后执行:

  <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>