Я создаю контроллер с методом 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. Я хотел бы, чтобы мой прокси-контроллер оставался универсальным для обработки любого из этих случаев.