Внутренний обработчик не был назначен с помощью обработчика делегирования WebApi
у меня есть проблема с WebApi, бросающим исключение здесь, в моем коде:
public class WebApiAuthenticationHandler : DelegatingHandler
{
private const string AuthToken = "AUTH-TOKEN";
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
var requestAuthTokenList = GetRequestAuthTokens(request);
if (ValidAuthorization(requestAuthTokenList))
{
// EXCEPTION is occuring here!....
return base.SendAsync(request, cancellationToken);
}
/*
** This will make the whole API protected by the API token.
** To only protect parts of the API then mark controllers/methods
** with the Authorize attribute and always return this:
**
** return base.SendAsync(request, cancellationToken);
*/
return Task<HttpResponseMessage>.Factory.StartNew(
() =>
{
var resp = new HttpResponseMessage(HttpStatusCode.Unauthorized)
{
Content = new StringContent("Authorization failed")
};
//var resp = new HttpResponseMessage(HttpStatusCode.Unauthorized);
//resp.Headers.Add(SuppressFormsAuthenticationRedirectModule.SuppressFormsHeaderName,"true");
return resp;
});
}
исключение происходит на строку:
base.SendAsync(request, cancellationToken);
Я понятия не имею, как это исправить. В моей таблице маршрутов есть следующее:
routes.MapHttpRoute("NoAuthRequiredApi", "api/auth/", new { Controller = "Auth" });
routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional }, null, new WebApiAuthenticationHandler());
маршрут это происходит на маршрут DefaultApi. Любая помощь очень ценится....
2 ответов
нашел ответ здесь и пример обработчика здесь.
вам нужно установить InnerHandler, которому вы хотите передать запрос.
просто добавьте это в ваш конструктор:
public class WebApiAuthenticationHandler : DelegatingHandler
{
public WebApiAuthenticationHandler(HttpConfiguration httpConfiguration)
{
InnerHandler = new HttpControllerDispatcher(httpConfiguration);
}
и передайте ссылку на GlobalConfiguration при создании нового экземпляра:
routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional }, null, WebApiAuthenticationHandler(GlobalConfiguration.Configuration));
иногда вы должны проверить URL RESTful, который вы запрашиваете, если он действительно существует в вашем контроллере. Я когда-либо сталкивался с таким исключением, которое было вызвано неправильным совпадением URL. спасибо.