vista usar una pasar mvc modelo llamar form desde datos controlador como c# asp.net asp.net-mvc asp.net-web-api

c# - usar - ¿Por qué una llamada a un Controlador ASP.NET MVC no ejecuta un DelegatingHandler?



viewbag core (1)

¿Por qué una llamada a un controlador no ejecuta un controlador delegado?

Bueno, porque ejecutan dos rutas de ejecución diferentes, si una ruta MVC coincide, ejecuta un MVCHandler, mientras que un controlador de delegación solo se ejecuta cuando una ruta Api coincide. En resumen, el diagrama de arriba no describe la división correctamente.

Los manejadores de delegación se ejecutan DESPUÉS del enrutamiento y antes de la selección de acción. Los pasos de selección de enrutamiento y acción a menudo se confunden o se usan indistintamente, aunque son dos pasos distintos.

El enrutamiento es el paso que coincide con una url a un conjunto de segmentos de cadena para producir los RouteValues ruta que asigna una clave de ruta a un valor de ruta. RouteValues se usa luego en la selección de acción. Los controladores de delegación se ejecutan entre estos dos pasos.

No hay un equivalente en MVC para delegar manejadores, una forma similar de hacerlo es escribir su propio controlador pero se está metiendo en aguas profundas, especialmente con la generación de enlaces.

Otro enfoque más simple es escribir un filtro global, pero tenga en cuenta que solo se ejecutará si realmente se seleccionó una acción.

Respuestas línea por línea

¿Los HttpMessageHandlers son parte de ASP.NET Web API pero no de ASP.NET MVC?

Sí, solo son construcciones WebAPI.

¿Cuál es el equivalente de HttpMessageHandler en MVC (EQUIVALENT en el diagrama)?

Ninguno realmente existe, y el diagrama está equivocado. El más cercano es un RouteHandler

¿Qué hace que la solicitud siga la canalización de API web (HORQUILLA en el diagrama)?

Coincidencia de una ruta WebAPI

¿Las solicitudes de la API web son fundamentalmente diferentes a las solicitudes de MVC?

No, no lo son, la horquilla ocurre solo después del enrutamiento.

EDITAR (18 de agosto de 2015): en MVC Core, la API web se fusionó en MVC, y hay una única canalización nueva.

Presente la pregunta

Recientemente me enteré de que una llamada a una Acción de ApiController desencadenará el método SendAsync , y que una llamada a una Acción de Controller vainilla no la desencadenará.

Búsqueda e investigación

He HttpMessageHandler Web Api y he aprendido que incluye HttpMessageHandler , que es el padre de la clase DelegatingHandler . Eso me lleva a pensar que los manejadores de mensajes HTTP, en general, solo se ejecutan como parte de una interconexión de API web.

Además, los manejadores de mensajes Http se ejecutan antes del enrutamiento de Url , por lo que probablemente no sea el enrutamiento de URL el que elija entre la API web y la interconexión de MVC.

... considere usar un filtro de acción en lugar de un manejador de mensajes [porque los filtros de una cción se ejecutan después de que se realiza el enrutamiento URI.

Pregunta

  • ¿Los HttpMessageHandlers son parte de ASP.NET Web API pero no de ASP.NET MVC?
  • ¿Cuál es el equivalente de HttpMessageHandler en MVC ( EQUIVALENT en el diagrama)?
  • ¿Qué hace que la solicitud siga la canalización de API web ( HORQUILLA en el diagrama)?
  • ¿Las solicitudes de la API web son fundamentalmente diferentes a las solicitudes de MVC?

Mi sensación es que va más o menos así, pero por favor corrígeme.

Request from Client | IIS | ASP.NET | HttpApplication.BeginRequest | et cetera | HttpApplication.MapRequestHandler - is this what does the routing? | FORK / / / / / / / / / / **Web API** **MVC** | | HttpControllerRouteHandler MvcRouteHandler | | HttpControllerHandler | | | HttpMessageHandlers EQUIVALENT? i.e. | DelegatingHandlers | incl. | HttpServer | CustomHandlers | HttpRoutingDispatcher | HttpControllerDispatcher |

Enlaces Útiles

Ciclo de vida de la aplicación ASP.NET

Póster ASP.NET Web API

Ciclo de vida de una aplicación ASP.NET MVC 5