Asp.net

IgnoreRoute with webservice - 從路由中排除 asmx URL

  • March 14, 2016

我將 filevistacontrol 添加到我的 asp.net MVC Web 應用程序中。

我有一個在路由中被忽略的 media.aspx 頁面

routes.IgnoreRoute("media.aspx");

這可以成功執行並提供標準的網路表單頁面。

添加 filevistacontrol 後,我似乎無法忽略控制項對其 web 服務的任何呼叫。

例如,下面的 ignoreRoute 似乎仍然被 MvcHandler 拾取。

routes.IgnoreRoute("FileVistaControl/filevista.asmx/GetLanguageFile/");

拋出的異常是:

'The RouteData must contain an item named 'controller' with a non-empty string value'

提前致謝。

我使用它(其他答案的組合)讓它工作:

routes.IgnoreRoute("{directory}/{resource}.asmx/{*pathInfo}");

簡短的回答:

routes.IgnoreRoute( "{*url}", new { url = @".*\.asmx(/.*)?" } );

長答案:

如果您的服務可以位於路徑的任何級別,則這些選項都不適用於所有可能的 .asmx 服務

routes.IgnoreRoute("{resource}.asmx/{*pathInfo}");
routes.IgnoreRoute("{directory}/{resource}.asmx/{*pathInfo}");

預設情況下,路由模式中的參數將匹配,直到找到斜杠。

如果參數以星號開頭*,就像pathInfo在那些答案中一樣,它將匹配所有內容,包括斜杠。

所以:

  • 第一個答案僅適用.asmx於根路徑中的服務,因為{resource}不會匹配斜杠。(適用於類似的東西http://example.com/weather.asmx/forecast
  • 第二個僅適用於.asmx距根目錄一層的服務。{directory}將匹配路徑的第一段和{resource}服務的名稱。(適用於類似的東西http://example.com/services/weather.asmx/forecast

沒有一個適用於http://example.com/services/weather/weather.asmx/forecast

IgnoreRoute解決方案是使用允許指定約束的方法的另一個重載。使用此解決方案,您可以使用匹配所有 url 的簡單模式,如下所示:{*url}. 然後你只需要設置一個約束來檢查這個 url 是否引用了一個.asmx服務。這個約束可以用這樣的正則表達式來表示:.*\.asmx(/.*)?. .asmx此正則表達式匹配任何以可選後跟斜杠和其後任意數量的字元結尾的字元串。

所以,最終的答案是這樣的:

routes.IgnoreRoute( "{*url}", new { url = @".*\.asmx(/.*)?" } );

引用自:https://stackoverflow.com/questions/4675367