10

2 つのプロジェクトを作成しました。

  1. 通常の基本的な ASP.NET MVC 4 アプリケーション
  2. 基本的な ASP.NET WebAPI アプリケーション

私がしたことはDelegatingHandler、それらの両方に派生したカスタム メッセージ ハンドラーを追加したことです。ここにあります:

public class MyHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        return base.SendAsync(request, cancellationToken);
    }
}

両方に登録しましglobal.asaxた:

GlobalConfiguration.Configuration.MessageHandlers.Add(new MyHandler());

ブレークポイントを入れました

return base.SendAsync(request, cancellationToken);

ASP.NET MVC と ASP.NET WebAPI の違いは、ASP.NET MVC application( http://localhost:4189/Something)を呼び出したときにブレークポイントがトリガーされないことです。ただし、Web API を呼び出すと ( http://localhost:7120/api/values)、ブレークポイントがトリガーされます。

何故ですか?これらのアプリケーション タイプの実行フローに違いはありますか?

また、 WebAPI アプリケーションでControllerはなく、通常の などをリクエストしようとすると、ブレークポイントがトリガーされませんApiControllerhttp://localhost:7120/Home

4

2 に答える 2

8

以下の Microsoft による有名な図に示されているように、ASP.NET Web API には(セクション)ASP.NET Web API: HTTP Message LIFECYLEと呼ばれる追加の拡張ポイントがあります。Message HandlersHTTP Message Handlers

これまでのところ、ASP.NET MVC (現在は 5) はそのような拡張ポイントを提供していません。

[フルサイズの PDF ポスターへのリンク]

ここに画像の説明を入力

MVC と WebAPI が (または少なくとも概念的に) 共有する唯一の拡張ポイントはフィルターです。MVC と WebAPI ではフィルターを登録する方法が異なるため、多くの人が現在の状況と同様の状況に置かれることに注意してください。

于 2016-03-10T00:15:30.553 に答える
2

MVC と WebAPI の両方のルート設定方法を比較できます

MVC の場合

利用可能なオーバーロードは、

  public static class RouteCollectionExtensions
    {

        public static VirtualPathData GetVirtualPathForArea(this RouteCollection routes, RequestContext requestContext, RouteValueDictionary values);

        public static VirtualPathData GetVirtualPathForArea(this RouteCollection routes, RequestContext requestContext, string name, RouteValueDictionary values);

        public static void IgnoreRoute(this RouteCollection routes, string url);

        public static void IgnoreRoute(this RouteCollection routes, string url, object constraints);

        public static Route MapRoute(this RouteCollection routes, string name, string url);

        public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);

        public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces);

        public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints);
       namespaces.

        public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);

        public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);
    }

WebAPI の場合

    public static class HttpRouteCollectionExtensions
    {
        public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate);

        public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults);

        public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints);

        public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler);

    }

最後の webapi ルート構成メソッドには、必要なカスタマイズされた HttpMessageHandler を渡すことができるパラメーターがあります。MVC ルーティングには、パイプラインにそのプロビジョニングがありません。

まとめると、MVC 実行コンテキストとパイプラインは WebAPI とはまったく異なります。これは、ブレーク ポイントが目的の場所に留まらないためです。

希望が役立ちます。

于 2014-02-25T07:09:20.757 に答える