WebAPI возвращает 404 при операциях PUT / DELETE - PullRequest
0 голосов
/ 24 сентября 2018

Это, кажется, довольно распространенная проблема, но ни одна из статей SO, на которые я смотрел, не решила это для меня.

Я работаю над приложением ASP.NET WebForms / MVC, работающим на IIS, наWindows 10 (т.е. не IIS Express), которая использует JQuery AJAX для вызова приложения WebAPI на отдельном сервере.Чтобы обойти проблемы CORS и добавить дополнительную обработку ко всем вызовам API, мы внедрили прокси на стороне сервера с использованием контроллеров MVC, поэтому каждый вызов в конечном итоге должен выглядеть примерно так:

[HttpPost]
public ActionResult Timesheets_Submit(Timesheet data)
{
    var processedData = ProcessTheRequestInSomeWay(data);
    var client = new SdkClient();
    var results = client.Timesheets.Post(processedData);
    return Json(results);
}

И все это работаетвполне успешно.

Однако мы довольно устали от необходимости внедрять новые методы прокси на стороне сервера каждый раз, когда добавляем новую конечную точку API, поэтому мы решили создать прозрачный прокси на стороне сервера, используя WebAPI,и пусть это делает реальную работу.

Прозрачный серверный прокси реализован так:

public class TransparentProxyDelegatingHandler : DelegatingHandler
{
    private static readonly Uri BaseUri = new Uri("https://my.apiserver.com");

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Headers.Add("X-Forwarded-For", request.GetClientIpAddress());
        request.RequestUri = new Uri(BaseUri, request.RequestUri.PathAndQuery.Replace("/Proxy", string.Empty));

        ProcessRequestInSomeWay(request);

        var response = await Client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken);

        return response;
    }
}

Таким образом, запрос к POST /Proxy/Timesheets будет преобразован в вызов к POST https://my.apiserver.com/Timesheets и ответ возвращен почти как есть.

Проблема, с которой я сталкиваюсь, заключается в том, что вызовы, использующие глаголы PUT и DELETE, отклоняются как 404 Not Found моим пользовательским интерфейсом (не API, явсе еще может вызвать это напрямую, используя, например, Fiddler / Postman);оригинальный прокси использовал эти глаголы, так что они не были настроены, просто когда я вызываю делегирующий обработчик.Обработчик никогда не вызывается, поэтому в механизме маршрутизации происходит что-то, что заставляет работать запросы PUT / DELETE MVC, но запросы WebAPI PUT / DELETE не выполняются.

1 Ответ

0 голосов
/ 25 сентября 2018

Оказывается, я не правильно регистрировал TransparentProxyDelegatingHandler;Я регистрировал это так в моем WebApiConfig:

configuration.MessageHandlers.Add(new TransparentProxyDelegatingHandler());

, но, как оказалось (спасибо https://blog.kloud.com.au/2013/11/24/do-it-yourself-web-api-proxy/),, я действительно хотел:

configuration.Routes.MapHttpRoute(name: "proxy", routeTemplate: "proxy/{*path}",
                handler: HttpClientFactory.CreatePipeline(
                    innerHandler: new HttpClientHandler(),
                    handlers: new DelegatingHandler[]
                    {
                        new TransparentProxyDelegatingHandler(), 
                    }),
                defaults: new { path = RouteParameter.Optional }, 
                constraints: null);

I 'Я предполагаю, что происходило то, что из-за того, что у меня не было реальных реализаций ApiController, связанных с WebApi, это не решалось как-то правильно на ранних стадиях конвейера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...