web-api-get route Vorlage von innen-handler

Ich suchte eine Menge, bevor Sie Fragen hier, aber je mehr ich Suche desto mehr verwirrt ich bekommen.

Also, ich habe erstellt eine Prozedur und ich werde versuchen, die route so:

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 gibt null zurück, so kann ich nicht auf den RouteTemplate Eigenschaft, aber ich kann
sehen Sie die route in einer Liste, die tief in den Stapel. Ich fand so viele verschiedene Möglichkeiten, die man nutzen kann, um die Strecke zu bekommen, aber diese Methoden bewerten zu null. Ich bin ein wenig verloren auf, wie man etwas so einfaches getan. Ich bin mit self-host für die Entwicklung, wird aber die Verwendung von IIS für die Bereitstellung.

UPDATE 1

Ich vergessen habe, hier, was anderes hatte ich versucht:

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

Die route ganz gut funktioniert, aber komischerweise, wenn ich versuche den controller-service, Anfrage, bekomme ich ein 404... wenn ich nur einen Schritt über das ich wird man die controller gut.

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

Ich bin mit autofac zu entdecken Sie alle Routen, die ich bin, zu definieren wie:

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

UPDATE 2

Wenn ich GetRouteData aufgerufen wird, nachdem die Zeile oben, ich bin in der Lage zu Holen Sie sich die route Vorlage:

base.SendAsync(request, cancellationToken);

var routeData = request.GetRouteData();

Also vielleicht habe ich falsch verstanden das ganze Bild und ich kann nicht Holen Sie sich die route-template, bevor der Hundeführer, der aufgelöst wird, welcher controller zum ausführen der Anfrage tut seine Arbeit... ist das der Fall?

Für die Referenz-das ist der handler arbeite ich an:

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;
    }

UPDATE 3

Code läuft wunderbar in einer nicht self-hosting-Umgebung, so ist das mehr wie ein eigenständiger host Problem.

InformationsquelleAutor MeTitus | 2014-08-09
Schreibe einen Kommentar