我创建了2个项目:
我做的是将自定义消息处理程序从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应用程序(http://localhost:4189/Something
)时,不会触发断点。然而,当我调用Web API(http://localhost:7120/api/values
)时,会触发断点 。
为什么?那些应用程序类型执行流程有什么不同吗?
此外,当我尝试请求正常的Controller
而非ApiController
的WebAPI应用程序时,如http://localhost:7120/Home
,则不会触发的断点。< / p>
答案 0 :(得分:6)
如下面Microsoft的着名ASP.NET Web API: HTTP Message LIFECYLE
图所示,ASP.NET Web API有一个额外的可扩展性点,称为Message Handlers
(HTTP Message Handlers
部分)。
到目前为止,ASP.NET MVC(目前为5个)并没有提供这样的可扩展性。
[Link to the full size PDF poster]
MVC和WebAPI共享(或至少在概念上)是过滤器的唯一可扩展点。请注意,MVC和WebAPI有不同的方式来注册过滤器,这使许多人处于与你现在相似的情况。
答案 1 :(得分: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完全不同,因为你的断点并不适合你想要的地方。
希望有所帮助。