代码之家  ›  专栏  ›  技术社区  ›  Tom Anderson

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

  •  33
  • Tom Anderson  · 技术社区  · 14 年前

    我有一个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 on this specific issue ,路由应该通过。

    对此,我们非常感谢您的帮助。


    更新

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

    2 回复  |  直到 14 年前
        1
  •  38
  •   Haacked    14 年前

    您遇到的问题是由于为.svc文件注册的生成提供程序造成的。此生成提供程序由默认的计算机级web.config文件注册。

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

      <system.web>
        <compilation debug="true" targetFramework="4.0">
            <buildProviders>
                <remove extension=".svc"/>            
            </buildProviders>
        ...
    
        2
  •  4
  •   Tom Anderson    14 年前

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