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

Tom*_*son 33 c# url-routing asp.net-mvc-2

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

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

我们正在慢慢更新网站到ASP.Net MVC 2,并且不想破坏系统中的任何当前URL.(JavaScript刷新问题)

我删除了/Services/api.svc并将此API调用的逻辑移动到以下Controller中:

HTTP://网站/ LegacyApi /的updateItem

不幸的是,在添加路由时,我似乎无法覆盖api.svc并继续收到404错误.

路线:

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

根据MSDN对这个具体问题,路由应该通过.

非常感谢任何帮助.


更新

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

Haa*_*ked 38

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

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

  <system.web>
    <compilation debug="true" targetFramework="4.0">
        <buildProviders>
            <remove extension=".svc"/>            
        </buildProviders>
    ...
Run Code Online (Sandbox Code Playgroud)

  • 谢谢Haack先生这是你的完整帖子:) http://haacked.com/archive/2010/09/07/routing-and-build-providers.aspx (3认同)

Tom*_*son 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>
Run Code Online (Sandbox Code Playgroud)