6

画像を生成するASP.NETMVC4サイトのhttpHandlerを作成しました。ProcessRequest関数が呼び出されていません。理由について何か考えはありますか?

MVC4、IIS Express、Windows 8 Pro

Web.config> system.webServer

 <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="TextImage" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
      <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
      <add name="TextImage" path="textimage/*.png" verb="*" resourceType="Unspecified" type="MultiStepUI.TextImageHandler, MultiStepUI_MOBETTER" />
    </handlers>
  </system.webServer>

利用方法

<img src="/textimage/step1.png?q=Step 1&c=404040&w=30&h=250&z=12" />
4

2 に答える 2

15

何を探すべきかを知っていれば、答えはWeb上で見つけることができます。

MVCルーティングエンジンは、すべてのリクエストをコントローラーにマップしようとします。これは、この場合は必要ありません。pathWeb.configにハンドラーを登録することに加えて、ASP.NETエンジンがルーティングを処理できるように、MVCルートエンジンにhttpHandlerを無視するように指示する必要があります。

PhilHaackの例を使用することにしました

リンク切れと戦うために、これは記事からの抜粋です

既定では、ASP.NETルーティングはディスク上に存在しないファイルの要求を無視します。この理由については、今後のルーティングの変更に関する以前の投稿で説明しました。簡単に言うと、画像などの静的ファイルのリクエストをルーティングしようとルーティングを試みたくありませんでした。残念ながら、ASP.NETの多くの機能がディスク上に存在しない.axdファイルを要求することを思い出したとき、これは私たちに頭痛の種を引き起こしました。

これを修正するために、RouteCollectionに新しい拡張メソッドIgnoreRouteを含めました。これは、StopRoutingHandlerルートハンドラー(IRouteHandlerを実装するクラス)にマップされたルートを作成します。事実上、「ルートを無視」に一致する要求はルーティングによって無視され、既存のhttpハンドラーマッピングに基づいて通常のASP.NET処理が行われます。したがって、デフォルトのテンプレートでは、次のルートが定義されていることがわかります。

ルート.IgnoreRoute( "{resource} .axd / {* pathInfo}");

これは、標準の.axdリクエストを処理します。ただし、ディスク上に存在しないファイルの要求がある場合もあります。たとえば、HTTPハンドラーをIHttpHandlerを実装するタイプに直接登録する場合です。ブラウザが自動的に行うfavicon.icoのリクエストは言うまでもありません。ASP.NETルーティングは、これらの要求をコントローラーにルーティングしようとします。これに対する1つの解決策は、適切な無視ルートを追加して、ルーティングがこれらの要求を無視する必要があることを示すことです。残念ながら、次のようなことはできません。

{* path} .aspx / {* pathinfo}

キャッチオールルートは1つだけ許可されており、URLの最後で発生する必要があります。ただし、次の方法をとることができます。この例では、次の2つのルートを追加しました。

ルート.IgnoreRoute( "{* allaspx}"、new {allaspx = @"。*\。aspx(/.*)?"});
ルート.IgnoreRoute( "{* favicon}"、new {favicon = @ "(。* /)?favicon.ico(/.*)?"});

ここで行っているのは、Eilonが示した手法で、すべてのURLをこれらのルートにマップしますが、制約ディクショナリを介して無視するルートを制限します。したがって、この場合、これらのルートは、(ディレクトリに関係なく)favicon.icoのすべての要求と、.aspxファイルの要求に一致します(したがって無視されます)。これらの要求を無視するようにルーティングに指示したため、これらの要求の通常のASP.NET処理が発生します。

于 2013-03-07T19:01:26.160 に答える
0

前の答えは正しいですが、記事はここに配置された抜粋から編集されています。無視ステートメントは次のようになります。

routes.IgnoreRoute("{*allaspx}", new {allaspx=@".*\.aspx(/.*)?"});
routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"});

{*allaspx}および{*favicon}文字列の「*」が元の文字列にないことに注意してください。リンクをたどり、更新された記事の例をたどるまで、それを機能させることができませんでした。

于 2014-07-23T08:16:03.867 に答える