Asp.net mvc 将所有请求转发给MVC中的委托处理程序
我有一个用MVC编写的视图。我在Asp.net mvc 将所有请求转发给MVC中的委托处理程序,asp.net-mvc,asp.net-web-api,Asp.net Mvc,Asp.net Web Api,我有一个用MVC编写的视图。我在CustomRouteFilter的以下方法中捕获所有请求 public class CustomRoutesHandler : RouteBase { public override RouteData GetRouteData(HttpContextBase httpContext) { //my code } } 在这里,我想将所有请求转发给自定义的DelegateHandler的SendAsync()方法。有人能帮
CustomRouteFilter
的以下方法中捕获所有请求
public class CustomRoutesHandler : RouteBase
{
public override RouteData GetRouteData(HttpContextBase httpContext)
{
//my code
}
}
在这里,我想将所有请求转发给自定义的DelegateHandler
的SendAsync()
方法。有人能帮我吗
public class RequestHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
//my code
}
}
公共类请求处理程序:DelegatingHandler
{
受保护的覆盖异步任务SendAsync(
HttpRequestMessage请求,CancellationToken CancellationToken)
{
//我的代码
}
}
如果您可以从CustomRouteHandler直接在RequestHandler上调用方法,则以下操作有效:
客户路线管理员:
public class CustomRoutesHandler : RouteBase
{
Route route;
public CustomRoutesHandler(Route route)
{
this.route = route;
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
RequestHandler requestHandler = new RequestHandler();
HttpRequestMessage request = new HttpRequestMessage();
HttpResponseMessage response = requestHandler.SendAsync(request).Result;
return route.GetRouteData(httpContext);
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
return route.GetVirtualPath(requestContext, values);
}
}
public class RequestHandler : DelegatingHandler
{
public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)
{
CancellationToken cancellationToken = CancellationToken.None;
return SendAsync(request, cancellationToken);
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
var tsc = new TaskCompletionSource<HttpResponseMessage>();
tsc.SetResult(response);
return tsc.Task;
}
}
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
Route route = routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.Remove(route);
routes.Add(new CustomRoutesHandler(route));
}
}
RequestHandler:
public class CustomRoutesHandler : RouteBase
{
Route route;
public CustomRoutesHandler(Route route)
{
this.route = route;
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
RequestHandler requestHandler = new RequestHandler();
HttpRequestMessage request = new HttpRequestMessage();
HttpResponseMessage response = requestHandler.SendAsync(request).Result;
return route.GetRouteData(httpContext);
}
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
return route.GetVirtualPath(requestContext, values);
}
}
public class RequestHandler : DelegatingHandler
{
public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)
{
CancellationToken cancellationToken = CancellationToken.None;
return SendAsync(request, cancellationToken);
}
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
var tsc = new TaskCompletionSource<HttpResponseMessage>();
tsc.SetResult(response);
return tsc.Task;
}
}
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
Route route = routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.Remove(route);
routes.Add(new CustomRoutesHandler(route));
}
}