10

私はまだ StructureMap で物事を理解しようとしています。私が遭遇している問題の 1 つは、null コントローラー タイプが渡されたときに Controller Factory クラスが爆発することです。これは、アプリケーションが初めてビルドされたときにのみ発生し、その後のすべてのビルドは正常に機能します。Visual Studioをシャットダウンしてプロジェクトを再度開いた場合でも(IISでこれを実行していません)。ある種のキャッシングが行われているようです。コントローラ クラスは次のようになります。

public class IocControllerFactory : DefaultControllerFactory
{
    protected override IController GetControllerInstance(Type controllerType)
    {
        try
        {
            return (Controller)ObjectFactory.GetInstance(controllerType);
        }
        catch (StructureMapException)
        {
            System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave());
            throw;
        }
    }
}

何が間違っている可能性がありますか?すべてのコントローラーを登録する必要がありますか? ありがとうございました。

4

4 に答える 4

8

ほとんどのブラウザは、サイトをロードするときに favicon.ico を探しています。おそらく、この動作に何らかのキャッシュが関係しています。これは、あなたが言及した奇妙な「最初のビルドでのみ失敗する」ことを説明している可能性があります。

私の場合、これがコントローラ ファクトリの null コントローラ タイプの問題を引き起こしていました。

global.asax にa を追加するroutes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });と、エラーがなくなります。MVC がコード内で favico.ico コントローラーを探すことなく、リクエストはファイルシステムにフォールスルーする必要があります。

これについての Gunnar Peipman の投稿へのリンクは次のとおりです。

カスタム コントローラ ファクトリ クラスで GetControllerType(string controllerName) をオーバーライドし、各リクエストの controllerName 値を確認することでわかりました。

于 2009-10-29T19:17:32.353 に答える
5

ninjectを中心に構築されたコントローラーファクトリーで同じ問題に遭遇しました。

ルーティングテーブルからルートを解決できない場合、またはルートが存在しないコントローラーを指定している場合、MVC は controllertype に null を渡すようです。これを解決するために2つのことをしました。ルート テーブルを確認し、ここで説明されているような 404 エラー ページを表示するキャッチオール ルートを追加することをお勧めします。Net MVC Routing Catchall not working

ルーティング デバッガーで何が問題なのかを確認することもできます。 http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

于 2009-06-20T13:10:33.887 に答える
1

私は同様の問題を抱えていました。存在しない画像や CSS ファイルなどに対する HTTP リクエストだったと思います。

MVC ルーティングは、要求されたファイルが物理的に存在するかどうかを最初に確認します。そうでない場合、URL は構成されたルートに対してテストされます。物理的に存在しない画像のリクエストがルーティング エンジンに渡され、どのルートにも一致しなかったため、NULL が使用されたと思います。

それを修正するには、FireBugなどを使用して壊れた HTTP リクエストを監視し、修正します。開発中、これらの問題を一時的に回避するために、次のようなルートを使用しました (すべてのリソース フォルダーは、_Images、_Styles などのアンダースコアで始まります)。

routes.IgnoreRoute("_*");  // TODO: Remove before launch

お役に立てれば!

于 2009-07-17T17:07:33.147 に答える
0

私があなたがする必要があると思うのは、デフォルトのMVCコントローラーファクトリがGetControllerInstanceメソッドで行うのとまったく同じことです。http://aspnetwebstack.codeplex.com/にあるDefaultControllerFactoryのMicrosoftソースコードを見ると、controllerTypeがnullの場合にDefaultControllerFactoryが404例外をスローすることがわかります。この情報に基づいてこれを行う方法は次のとおりです。

 public class StructureMapControllerFactory : DefaultControllerFactory
 {
      protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
      {
           if (controllerType == null)
                return base.GetControllerInstance(requestContext, controllerType);
           var controller = ObjectFactory.GetInstance(controllerType);
           return (IController)controller;
      }
 }

基本的に、これにより、ユーザーが無効なルートを入力したときに、アプリケーションがそれを404エラーとして処理することが保証されます。

于 2012-10-24T12:56:49.323 に答える