网页API得到内部处理程序路径模板 [英] web api get route template from inside handler

查看:168
本文介绍了网页API得到内部处理程序路径模板的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我搜索了很多把问题在这里出现,但我越搜索越糊涂,我得到。

I searched a lot before putting the questions here but the more I search the more confused I get.

所以,我已经创建了一个处理程序,我试图让这样的路线:

So I have created an handler and I am trying to get the route like this:

public class ExecutionDelegatingHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (securityAuthority.VerifyPermissionToExecute(request.GetRouteData().Route.RouteTemplate, request.Headers))
        {
            return base.SendAsync(request, cancellationToken);
        }
        else
        {
            httpResponseMessage.StatusCode = HttpStatusCode.Unauthorized;
        }
    }
 }

GetRouteData 的返回null,所以我不能获取到RouteTemplate财产,但我可以
见路线有深在堆栈的列表。我发现哪一个可用于获取途径很多不同的方式,但这些方法计算为NULL为好。我如何获得这么简单的东西做了一个有点失落。我使用自主机的发展,但将使用IIS进行部署。

GetRouteData returns null so I can't get to the RouteTemplate property but I can see the route there in a list deep in the stack. I found so many different ways which one can use to get the route, but those methods evaluate to null as well. I am a bit lost on how to get something so simple done. I am using self host for development but will use IIS for deployment.

更新1

我忘了这里还有什么我曾尝试:

I forgot to put here what else I had tried:

//NULL
request.GetRouteData(); 
//EMPTY
request.GetRequestContext().Configuration.Routes.GetRouteData(request).Route.RouteTemplate;
//EMPTY
request.GetConfiguration().Routes.GetRouteData(request).Route.RouteTemplate;

路由工作得很好,但奇怪的是,如果我试图让控制器服务,它要求我得到一个404 ......如果我只是跳过,我会得到控制器就好了。

The route works just fine, but strangely if I try to get the controller to service that request I get a 404... if I just step over that I will get to the controller just fine.

HttpControllerDescriptor httpControllerDescriptor = request.GetRequestContext().Configuration.Services.GetHttpControllerSelector().SelectController(request);
IHttpController httpController = httpControllerDescriptor.CreateController(request);

我使用autofac发现所有这一切,我只是定义路线如下:

I am using autofac to discover all the routes which I am defining just like:

[Route("queries/organization/clients")]
[HttpGet]
public ClientInitialScreenModel GetClients()
{
    return OrganizationModelsBuilder.GetClientInitialScreen();
}

更新2

如果我GetRouteData被上面的行之后调用,我能够得到的路由模板:

If I GetRouteData gets called after the line above, I am able to get the route template:

base.SendAsync(request, cancellationToken);

var routeData = request.GetRouteData();

所以也许我误解了整个画面,我不能得到解析该控制器为请求执行处理程序之前的路径模板做的工作......是这样吗?

So maybe I misunderstood the whole picture and I cant get the route template before the handler that resolves which controller to execute for the request does its work... is that the case?

作为参考,这是我工作的处理程序:

public class ExecutionDelegatingHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var securityAuthority = (ISecurityAuthority) request.GetDependencyScope().GetService(typeof (ISecurityAuthority));
        var configuration = (IWebApiConfiguration)request.GetDependencyScope().GetService(typeof(IWebApiConfiguration));
        var tsc = new TaskCompletionSource<HttpResponseMessage>();
        var httpResponseMessage = new HttpResponseMessage();

        if (request.RequestUri.AbsolutePath.Equals(configuration.CommandGatewayUrl, StringComparison.InvariantCultureIgnoreCase))
        {
            var apiMessage = JsonConvert.DeserializeObject<ApiCommandEnvelope>(request.Content.ReadAsStringAsync().Result);

            if (securityAuthority != null && !securityAuthority.VerifyPermissionToExecute(apiMessage, request.Headers))
            {
                httpResponseMessage.StatusCode = HttpStatusCode.Unauthorized;
            }
            else
            {
                var messageProcessor = (IWebApiMessageProcessor)request.GetDependencyScope().GetService(typeof(IWebApiMessageProcessor));
                var reponse = messageProcessor.HandleRequest(apiMessage);

                httpResponseMessage.StatusCode = (HttpStatusCode) reponse.StatusCode;

                if (!string.IsNullOrEmpty(reponse.Content))
                {
                    httpResponseMessage.Content = new StringContent(reponse.Content);
                }
            }
        }
        else
        {
            if (securityAuthority != null && !securityAuthority.VerifyPermissionToExecute(request.GetRouteData().Route.RouteTemplate, request.Headers))
            {
                httpResponseMessage.StatusCode = HttpStatusCode.Unauthorized;
            }
            else
            {
                return base.SendAsync(request, cancellationToken);
            }
        }

        tsc.SetResult(httpResponseMessage);

        return tsc.Task;
    }

更新3

在code运行良好的非自托管环境,所以这更像是一种自我主机的问题。

The code runs fine in a non self hosting environment, so this is more like a self host issue.

推荐答案

该网页API仍然有很多需要提高的。这是比较难找到一个方法来得到这个工作,我只是希望这样可以节省其他人不花我就试​​图找到解决一切的时候。

The Web Api still have a lot to improve. It was tricky to find a way to get this working and I just hope this saves other guys from spending all the time I did on trying to find the solution.

 var routeTemplate = ((IHttpRouteData[]) request.GetConfiguration().Routes.GetRouteData(request).Values["MS_SubRoutes"])
                                    .First().Route.RouteTemplate;

这篇关于网页API得到内部处理程序路径模板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆