Pregunta Servidor proxy “transparente” para solicitudes a la API web de ASP.NET


Tener un punto final de la API web ASP.NET que genere respuestas JSON. Pero debido a dos factores no se pueden consumir directamente desde un navegador.

  1. problemas entre dominios
  2. necesita proporcionar un ticket de sesión para la API que solo se conoce del lado del servidor

Así que necesito un servidor proxy ligero para las solicitudes del cliente (navegador) para extender la solicitud con la clave de sesión. No desea imponer una sobrecarga de deserialización de las solicitudes JSON del cliente o las respuestas JSON de la API web en el código proxy. Quisiera pasar la carga útil "como está" y deserializar las solicitudes de clientes solo del lado de la API web y las respuestas de la API web del lado del cliente (navegador). Ese es el proxy que toma json del navegador y lo pasa directamente a la API web. También pasa la respuesta JSON de la API web al navegador directamente sin deserialización. Solo un proxy ficticio que no sabe nada sobre los datos que transfiere. Por favor, sugiera si es factible y cuál es la mejor manera de implementarlo. La aplicación web existente (la que se utiliza para generar las páginas del cliente) se implementa utilizando ASP.NET MVC 4.

Gracias por adelantado.


5
2017-09-11 14:39


origen


Respuestas:


yo escribió uno para una versión anterior de WebApi. El código debería ser bastante fácil de actualizar para sus propósitos.

La idea básica es crear un WebApi DelegatingHandler que pase la solicitud a un HttpClient:

    public class ForwardProxyMessageHandler : DelegatingHandler
    {
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            request.Headers.Add("X-Forwarded-For", request.GetClientIp());
            if (request.Method == HttpMethod.Get || request.Method == HttpMethod.Trace) request.Content = null;
            request.RequestUri = new Uri(request.RequestUri.ToString().Replace(":3002", "")); //comes through with the port for the proxy, rewrite to port 80
            request.Headers.AcceptEncoding.Clear();
            var responseMessage = await new HttpClient().SendAsync(request, HttpCompletionOption.ResponseHeadersRead);
            responseMessage.Headers.TransferEncodingChunked = null; //throws an error on calls to WebApi results
            if (request.Method == HttpMethod.Head) responseMessage.Content = null;
            return responseMessage;
        }

    }

9
2017-09-12 09:26