Nie, ponieważ moduły obsługi komunikatów działają na surowym HttpRequestMessage
lub surowym HttpResponseMessage
(w przypadku kontynuacji). Tak naprawdę, nie ma koncepcji "bieżącego kontrolera wykonującego" z DelegatingHandlers
, ponieważ procedury obsługi komunikatów zostaną wywołane przed wysłaniem żądania do kontrolera lub (ponownie w przypadku kontynuacji) po tym, jak kontroler zwróci odpowiedź.
Jednak to naprawdę zależy od tego, co próbujesz zrobić.
Jeśli chcesz wiedzieć, do którego kontrolera zostanie wysłane żądanie, możesz ręcznie wywołać mechanizm, który będzie wewnętrznie wybierać kontrolery.
public class MyHandler : DelegatingHandler
{
protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
var config = GlobalConfiguration.Configuration;
var controllerSelector = new DefaultHttpControllerSelector(config);
// descriptor here will contain information about the controller to which the request will be routed. If it's null (i.e. controller not found), it will throw an exception
var descriptor = controllerSelector.SelectController(request);
// continue
return base.SendAsync(request, cancellationToken);
}
}
Dzięki, mam procedurę walidacji i byłoby miło, aby móc sprawdzić typ kontrolera, aby zobaczyć, czy ma ona atrybut niestandardowy zdefiniowany, więc mogę tego uniknąć rutyny weryfikacji. Powinno to umożliwić. –
świetnie. tak, możesz to łatwo zrobić po pobraniu instancji HttpControllerDescriptor –
@FilipW Czy istnieje "ładny" sposób na zrobienie tego bez wyrzucania wyjątku? w kodzie źródłowym wywołanie 'SelectController' ostatecznie wywołuje' this._controllerInfoCache.Value.TryGetValue (controllerName, out controllerDescriptor) 'jednak' _controllerInfoCache' nie jest publicznie dostępny w żaden sposób – wal