【问题标题】:HttpMessageHandler with MapHttpAttributeRoutes not working带有 MapHttpAttributeRoutes 的 HttpMessageHandler 不起作用
【发布时间】:2016-10-13 22:55:04
【问题描述】:

我正在关注this tutorial,试图在此图像中获取 MessageHandler3 的行为:

这是我的一个控制器的一部分:

public class UserController : ApiController
    {
[Route("api/users")]
        [ResponseType(typeof(User))]
        public IHttpActionResult PostUser([FromBody]User newUser)
        {
            try
            {
                userService.InsertUser(newUser);
                return Ok(newUser);
            }

            catch (Exception e)
            {
                return BadRequest(e.Message);
            }
        }
}

这是处理程序的虚拟版本:

 public class UserTokenHandler : DelegatingHandler
    {
        public UserTokenHandler()
        {
        }

        protected override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            if (true)//actual validation method
            {
                var response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
                var tsc = new TaskCompletionSource<HttpResponseMessage>();
                tsc.SetResult(response);
                return tsc.Task;
            }
            return base.SendAsync(request, cancellationToken);
        }
}

以下是我对 WebApiConfig 类所做的更改:

public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                //config.MapHttpAttributeRoutes();
                var handlers = new DelegatingHandler[] { new UserTokenHandler() };
                var routeHandlers = HttpClientFactory.CreatePipeline(new HttpControllerDispatcher(config), handlers);
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional },
                    constraints: null,
                    handler: routeHandlers
                );
                config.MapHttpAttributeRoutes();
            }
        }

我的问题在于注释行。如果我不包含它或将它放在最后(就像现在一样),则处理程序会执行,但是在尝试使用我的 api 时会出现此错误:

{
  "Message": "No HTTP resource was found that matches the request URI 'http://localhost:12986/api/users'.",
  "MessageDetail": "No type was found that matches the controller named 'users'."
}

但如果我取消注释它(并删除底部之一),我会直接进入控制器而不通过处理程序。

我希望它通过handler然后找到方法,我该如何解决它?

【问题讨论】:

  • 第一场比赛获胜时,地图的顺序很重要。在约定路线之前映射属性路线

标签: c# asp.net asp.net-web-api asp.net-web-api2 asp.net-web-api-routing


【解决方案1】:

如果需要,您实际上可以在映射之前添加处理程序。

config.MessageHandlers.Add(new UserTokenHandler());
config.MapHttpAttributeRoutes();
//...other code

我已经这样做了,确实实现了节流处理程序,并且工作起来就像一个魅力,但这将适用于所有进入的请求。

如果你希望它只适用于用户控制器,那么你需要放弃属性路由并为用户控制器使用基于约定的路由。

但是,如果您将基于约定的路由和属性路由混合在一起,那么这将不会很好地混合,因为就像您链接到的文章一样。这更适合基于约定的路由。

【讨论】:

  • 如果我只想将处理程序用于某些特定路线,这会起作用吗?
  • 基于约定的路由还是属性路由?在您的示例中,您的控制器上有属性路由,但正在尝试在基于约定的路由上应用委托
  • 如果你希望它只适用于用户控制器,那么你需要放弃属性路由并为用户控制器使用基于约定的路由
  • 一组包含两种类型的路由
  • 这不会很好地混合。如您链接到的文章中所示。这更适合基于约定的路由
【解决方案2】:

如果我没记错的话,打电话是至关重要的

config.MapHttpAttributeRoutes();

你打电话之前

config.Routes.MapHttpRoute

【讨论】:

  • 对,但是当我这样做时,处理程序会被完全忽略
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 2017-11-07
  • 2021-09-05
  • 2014-12-10
  • 2011-09-30
  • 2013-01-06
  • 2016-03-17
相关资源
最近更新 更多