DelegatingHandler переопределить SendAsyn c возврат 404 при вызове URI субдомена - PullRequest
0 голосов
/ 13 апреля 2020

У меня настроен прокси-шлюз для вызова API-сервера со следующим классом DelegatingHandler SendAsyn c, который работает путем вызова с именем сервера HTTP или по IP-адресу HTTP, но возвращает ошибку 404, вызывая субдомен

public class ProxyHandler : DelegatingHandler
{ 
    protected override System.Threading.Tasks.Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        var pathandquery = request.RequestUri.PathAndQuery;

        // APPserver webapi URL
        var uri = "http:localhost/api/";

        request.RequestUri = uri;

        if (request.Method == HttpMethod.Get)
        {
            request.Content = null;
            return base.SendAsync(request, cancellationToken)
                   .ContinueWith<HttpResponseMessage>(t =>
                   {
                       var response = t.Result;
                       response.Headers.Add("Access-Control-Allow-Origin", "*");

                       return response;
                   });
        }
        else
        {

            if (request.Method == HttpMethod.Post)
            {

                return base.SendAsync(request, cancellationToken)
                  .ContinueWith<HttpResponseMessage>(t =>
                  {
                      var response = t.Result;
                      response.Headers.Add("Access-Control-Allow-Origin", "*");
                      response.Headers.Add("Access-Control-Allow-Credentials", "true");
                      response.Headers.Add("Access-Control-Allow-Methods", "POST");
                      return response;
                  });
            }

            if (request.Method == HttpMethod.Put)
            {

                return base.SendAsync(request, cancellationToken)
                  .ContinueWith<HttpResponseMessage>(t =>
                  {
                      var response = t.Result;
                      response.Headers.Add("Access-Control-Allow-Origin", "*");
                      response.Headers.Add("Access-Control-Allow-Credentials", "true");
                      response.Headers.Add("Access-Control-Allow-Methods", "PUT");
                      return response;
                  });
            }
        }
        return base.SendAsync(request, cancellationToken);
    }
}

API работает через браузер с https и поддоменом, но возвращает обработчик ошибки 404 через обработчик делегата sendasyn c. запрос выглядит следующим образом:

запрос с именем сервера или I адресом - работает

Method: POST, RequestUri: 'http://<servername>/Account/IsUserFirstLoginStatus', Version: 1.1, Content: System.Web.Http.WebHost.HttpControllerHandler+LazyStreamContent, Headers:
{
  Connection: close
  Accept: application/json
  Accept: text/plain
  Accept: */*
  Accept-Encoding: gzip
  Accept-Encoding: deflate
  Accept-Encoding: br
  Accept-Language: en-US
  Accept-Language: en; q=0.9
  Authorization: Bearer
  Host: proxyserver.com
  Referer: https://frontendsite.com/
  User-Agent: Mozilla/5.0
  User-Agent: (Windows NT 10.0; WOW64)
  User-Agent: AppleWebKit/537.36
  User-Agent: (KHTML, like Gecko)
  User-Agent: Chrome/80.0.3987.163
  User-Agent: Safari/537.36
  sec-fetch-dest: empty
  deviceinfo: {"userAgent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36","os":"Windows","browser":"Chrome","device":"Unknown","os_version":"windows-10","browser_version":"80.0.3987.163"}
  origin: https://frontendsite.com
  sec-fetch-site: same-site
  sec-fetch-mode: cors
  Content-Length: 50
  Content-Type: application/json
}

Ответ

StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Vary: Origin
  Access-Control-Allow-Credentials: true
  Access-Control-Allow-Origin: https://proxy.com
  Server: Kestrel
  X-Powered-By: ASP.NET
  X-Powered-By: ASP.NET
  Date: Sun, 12 Apr 2020 18:24:48 GMT
  Connection: close
  Content-Length: 64
  Content-Type: application/json; charset=utf-8
}

Но ответ 404 ошибка через поддомен (который работает через браузер или почтальон) Запрос

Method: POST, RequestUri: 'https://subdomain.domain.com/Account/IsUserFirstLoginStatus', Version: 1.1, Content: System.Web.Http.WebHost.HttpControllerHandler+LazyStreamContent, Headers:
{
  Connection: close
  Accept: application/json
  Accept: text/plain
  Accept: */*
  Accept-Encoding: gzip
  Accept-Encoding: deflate
  Accept-Encoding: br
  Accept-Language: en-US
  Accept-Language: en; q=0.9
  Authorization: Bearer
  Host: proxydomain.com
  Referer: https://frontenddoamin.com/
  User-Agent: Mozilla/5.0
  User-Agent: (Windows NT 10.0; WOW64)
  User-Agent: AppleWebKit/537.36
  User-Agent: (KHTML, like Gecko)
  User-Agent: Chrome/80.0.3987.163
  User-Agent: Safari/537.36
  sec-fetch-dest: empty
  deviceinfo: {"userAgent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36","os":"Windows","browser":"Chrome","device":"Unknown","os_version":"windows-10","browser_version":"80.0.3987.163"}
  origin: https://frontenddomain.com
  sec-fetch-site: same-site
  sec-fetch-mode: cors
  Content-Length: 50
  Content-Type: application/json
}
...