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

33

我有一个URL,它是从主网站的某个JSON帖子中使用的:

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关于这个问题的说明,路由应该可以通过。
非常感谢您的任何帮助。

更新

标准的.aspx页面路由正常工作,因此这似乎是与.svc文件及其处理方式有关的特定问题。


我已经从 Phil Haack 加载了 RouteDebugger,但它甚至没有提示 Routing 表显示,仍然出现 404。 - Tom Anderson
2个回答

39

你遇到的问题是由于为 .svc 文件注册的构建提供程序所导致的。这个构建提供程序由默认的机器级 web.config 文件进行注册。

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

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

谢谢,这就解决了问题,并且摆脱了我麻烦的变通方法 :) - Tom Anderson
3
谢谢Haack先生,这是您的完整帖子 :) http://haacked.com/archive/2010/09/07/routing-and-build-providers.aspx - Wahid Bitar

5

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接