带有MapHttpAttributeRoutes的HttpMessageHandler不起作用

时间:2016-10-13 22:55:04

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

我正在试图获取此图像中MessageHandler3的行为this tutorialenter image description here

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

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'."
}

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

我希望它通过处理程序然后找到方法,我该如何修复它?

2 个答案:

答案 0 :(得分:2)

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

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

我这样做会实现油门处理程序并且像魅力一样工作,但这适用于所有进入的请求。

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

但是,如果您混合使用基于约定的路径和属性路径,那么就不会很好地混合,因为在您链接的文章中。这更适合基于约定的路由。

答案 1 :(得分:0)

如果记忆正确,请致电

至关重要
config.MapHttpAttributeRoutes();

之前 您致电

config.Routes.MapHttpRoute