2011-01-12 9 views
11

私のasp.net MVC Webアプリケーションにfilevistacontrolを追加します。WebサービスでIgnoreRoute - ルーティングからasmx URLを除外

私は

routes.IgnoreRoute("media.aspx"); 

これが正常に動作し、標準のWebフォームページを用意していますとルーティングでは無視され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' 

感謝。

+0

あなたはMVCのどのバージョンを使用していますか? – smartcaveman

答えて

8

私はそれがこの(他の回答のコンボ)を使用して動作するようになった:

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

信じてください:Webサービスがアプリケーションのルートにある場合、これは失敗します。私の答えは、それがなぜ失敗するのか、そしてそれを働かせる方法を説明します。 – JotaBe

1

あなたが試してみました:

routes.IgnoreRoute("{resource}.aspx/{*pathInfo}"); 
routes.IgnoreRoute("{resource}.asmx/{*pathInfo}"); 
+0

お返事ありがとう、ええ、私はそれらの両方を試みました。私は自分のURLと一致するようにルーティングを取得することができます。 iveは、指定されたURLのルートを追加し、例外をスローするハンドラを割り当てようとしましたが、処理されないようです。私はそれが物理的なファイルであることとは何かを考える。 – boz

2

を使用するとどうなります:

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

問題が解決しない場合は、あなたを助けるためにASP.NETルーティングデバッガを使用してみてください: http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

+0

このルートデバッガよりも優れたものがあります:Glimpseは、Nugetパッケージとしてダウンロードすることができ、より多くの経路をあまり侵入しない方法でデバッグすることができます。 – JotaBe

2

試用:

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

これはPhil Haackの推奨であるhereに基づいています。

0

ルート設定の送信元を投稿した場合に役立ちます。私は暗闇の中で一発を撮り、あなたのIgnoreRoute()コールがすべてあなたのルーティング定義の一番上にあることを確認するつもりです。

IgnoreRouteの仕組みは、無視されたルートURLと制約に一致するルートを作成し、StopRoutingHandlerをRouteHandlerとして付加することです。 UrlRoutingModuleは、StopRoutingHandlerが要求をルーティングすべきでないことを意味します。

われわれが知っているように、経路は定義されている順番で一致します。したがって、"FileVistaControl/filevista.asmx/GetLanguageFile/"ルートの前に{controller}/{action}/{id}ルートが表示されている場合は、"{controller}/{action}/{id}"ルートと一致します。

私はここで完全にオフになっているかもしれませんが、あなたのソースを見ずに知るのは難しいです。お役に立てれば。そして、ソースコードを投稿してください!あなたはより良い答えを得るでしょう。

12

短い答え:

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

長い答え:

をあなたのサービスは、いずれかであることができればこれらのオプションはすべて可能な限り動作しません。ASMXサービス:彼らはスラッシュを見つけるまで

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

デフォルトでは、ルートパターンのパラメータが一致します。

パラメータが、pathInfoのように、スラッシュを含むすべてのものと一致する場合は、*の星で始まります。

ので:{resource}はスラッシュとは一致しませんbecasuse

  • 最初の答えは、ルート・パスに.asmxサービスのために動作します。 (http://example.com/weather.asmx/forecastのようなもので動作します)
  • 2番目のサービスは、ルートから1レベル離れた.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(/.*)?" }); 
関連する問題