Это, кажется, довольно распространенная проблема, но ни одна из статей 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 не выполняются.