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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Web-Api hat noch eine Menge zu verbessern. Es war schwierig, einen Weg zu finden, damit es funktioniert und ich hoffe, das spart anderen Leuten zu verbringen die ganze Zeit ich habe.
Ich hatte ein ähnliches Problem, war aber in der Lage, um die route in der message-handler durch die folgenden:
Anfrage.GetConfiguration().Routen.GetRouteData(Anfrage).Route.RouteTemplate;
Die Antwort von Marco (siehe unten) ist korrekt, solange es nicht mehr als eine route definiert, die mit der gleichen HttpMethod. Die
.First()
nehmen Sie die 1. route definiert, die in diesem spezifischenApiController
, aber nicht sicher, packt Sie die richtigen sind. Wenn Sie dieControllerContext
um die Strecke zu bekommen, können Sie sicher sein, Sie haben die genauen Endpunkt, den Sie wollen.Marco:
Code:
tatsächlich gibt eine Sammlung von
IHttpRouteData
, und es enthält einen Datensatz für jeden Endpunkt, welche den gleichen HttpMethod (Post, Get, etc.)... Die.First()
gar nicht garantieren, dass Sie erhalten die Sie haben wollen.Garantiert Zu Packen Richtige Endpunkt ist
RouteTemplate
:Ich eine Erweiterung Methode so aufrufen das Sie tun würde:
Dies wird sicherstellen, dass Sie die spezifischen
RouteTemplate
vom Endpunkt telefonieren.Ich denke, dass kann man der route der Daten aus Anfrage.Eigenschaften Eigenschaft und einfache unit-Tests.
Referenz-link-code