Как правильно вернуть данные моему клиенту с прокси-контроллера - PullRequest
0 голосов
/ 13 июня 2019

Я создаю контроллер с методом POST, который я намерен использовать в качестве «сквозного» контроллера для получения данных из другого URL-адреса. «Настоящий» URL не может принимать запросы напрямую из браузера, потому что для конечной точки API требуется значение, которое сначала должно быть рассчитано на моем сервере. Таким образом, в моем прокси-контроллере я вычисляю это требуемое значение и отправляю это значение (вместе с остальной частью запроса) на «реальный» URL. И тогда мой контроллер получает ответ от «реального» URL и передает его обратно моему клиенту (браузеру).

По крайней мере, так и должно быть. Кажется, работает в основном. Тем не менее, я сталкиваюсь с проблемой, когда я передаю ответ обратно в браузер. Вот контроллер:

public class ProxyController : Controller
{
    [HttpPost]
    public HttpResponseMessage Index()
    {
        var paramObjects = new Dictionary<string, object>();
        Request.Form.CopyTo(paramObjects);
        var parameters = paramObjects.Select(x => new KeyValuePair<string, string>(x.Key, x.Value.ToString()));
        var encodedContent = new FormUrlEncodedContent(parameters);
        var url = "https://the_real_url.com";
        var httpClient = new HttpClient();
        HttpResponseMessage response = null;
        using (var requestMessage = new HttpRequestMessage(HttpMethod.Post, url))
        {
            //CALCULATE AND ADD THE REQUIRED VALUE TO THE HEADER
            requestMessage.Headers.Add("CONNECTUSER", GetSAN());
            requestMessage.Content = encodedContent;
            var task = httpClient.SendAsync(requestMessage).ContinueWith((x) =>
            {
                response = x.Result;
            });
            task.Wait();
            return response;
        }
    }
}

А на клиенте я отправляю данные формы на мой прокси-контроллер:

<form name="submitForm" id="submitForm" style="font-size: 0px;" action="@Url.Content("~/proxy")" method="post" target="_blank">
    <input type="hidden" name="MY_action" value="RUN">
    <input type="hidden" name="MY_path" value="blah/blah/blah">
    <input type="hidden" name="SN1" value="3568458">
    <input type="hidden" name="DUPLEX" value="Y">
    <input type="hidden" name="MY_Random" value="0.5740999095141093">
    <input type="hidden" name="MY_sub_action" value="USER_ACTION">
</form>

Когда я выполняю код в контроллере, ответ, который я получаю от моего response объекта, возвращает код 200, и все содержимое, кажется, там. Но в браузере я вижу только следующее:

StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Pragma: no-cache X-XSS-protection: 0 Strict-Transport-Security: max-age=31557600; includeSubDomains Cache-Control: no-store, must-revalidate, no-cache Date: Thu, 13 Jun 2019 15:31:52 GMT Set-Cookie: JSESSIONID=34276Y5F3425F325325H3.ajp13w; Path=/my_apps; Secure; HttpOnly Set-Cookie: COOKIE_HERE; Path=/; Secure; HTTPOnly Set-Cookie: TANOTHER_COOKIE_HERE; path=/my_apps; HTTPonly; Secure Content-Length: 11349 Content-Type: text/html; charset=UTF-8 Expires: Thu, 01 Jan 1970 00:00:00 GMT }

Как будто я вижу информацию заголовка внутри тела. В браузере я хочу видеть HTML (или другой тип контента), который возвращается из «реального» URL. Содержание там. Я вижу это, когда отлаживаю. Но все, что я вижу в браузере, это информация заголовка. Я не уверен, как правильно передать эти данные обратно в браузер. Это почти как если бы я возвращал неправильный тип объекта из моего прокси-контроллера или чего-то еще. Как я могу получить эти данные для надлежащей передачи в браузер?

Стоит отметить, что «реальный» URL может возвращать данные нескольких типов. Это может быть HTML, PDF или JSON. Я хотел бы, чтобы мой прокси-контроллер оставался универсальным для обработки любого из этих случаев.

...