Я использую Nopcommerce, который недавно был обновлен для использования MVC3 - ранее он использовал веб-формы. Я пытаюсь подключиться к размещенному сайту Worldpay (платежный шлюз). Процесс немного запутан, но по существу форма должна быть отправлена в Worldpay, и пользователь затем перенаправляется на свой размещенный сайт, чтобы заполнить данные своей кредитной карты и т. Д.ASP.NET MVC 3 - Замена HttpContext Response Не работает
Nopcommerce позаботится об этом, используя метод Post, который, на стороне сервера, создает форму, которая должна быть размещена и заменяющий ответ HttpContext со встроенным из HTML
_httpContext.Response.Clear();
_httpContext.Response.Write("<html><head>");
_httpContext.Response.Write(string.Format("</head><body onload=\"document.{0}.submit()\">", FormName));
_httpContext.Response.Write(string.Format("<form name=\"{0}\" method=\"{1}\" action=\"{2}\" >", FormName, Method, Url));
for (int i = 0; i < _inputValues.Keys.Count; i++)
_httpContext.Response.Write(string.Format("<input name=\"{0}\" type=\"hidden\" value=\"{1}\">", HttpUtility.HtmlEncode(_inputValues.Keys[i]), HttpUtility.HtmlEncode(_inputValues[_inputValues.Keys[i]])));
_httpContext.Response.Write("</form>");
_httpContext.Response.Write("</body></html>");
_httpContext.Response.End();
Это отлично работает в версии WebForms, но не работает в версии MVC. Нет ошибки, и все работает правильно. Однако, обработка продолжается и выполнение возвращается из уровня службы (в которых этот метод находится) к контроллеру и следующее перенаправление выдается:
return RedirectToRoute("CheckoutCompleted");
ли MVC работать по-другому, чтобы WebForms в отношении изменения ответа на серверная сторона? Я попытался следующий код и может подтвердить, что WorldPay действительно удара и посылает ответ я бы ожидать:
_httpContext.Response.Clear();
var webClient = new WebClient();
var responseBytes = webClient.UploadValues(Url, "POST", _inputValues);
var response = Encoding.UTF8.GetString(responseBytes);
_httpContext.Response.Write(response);
_httpContext.Response.End();
Примечание: в приведенных выше примерах HttpContext вводится в службу. Же результат достигается за счет использования HttpContext.Current
Обновление:
делая немного больше рытье я вижу, что если я запись в поток ответа от любого контроллера и закончить ответ я получаю пустой (0 длина ответ) экран. Ниже приведено действие индекса на домашнем контроллере, которое вызывает указанную проблему. Тот же самый код, в проекте я холостой создал, работает отлично ...
public ActionResult Index()
{
Response.Write("test");
Response.End();
return View(_storeInformationSettings);
}
использовать скрипач для обоих и сравнить ответы. вопрос о том, «работает ли mvc по-разному», немного загружен, поскольку он зависит от того, что что-либо делает в конвейере веб-форм или против контроллера mvc. в общем, «нет», но это зависит от возвращаемого типа контента и т. д. –
Я тестировал, и для меня это работало нормально. Я имею в виду, что я мог писать на экране с помощью 'response.Write()' и мой вызов 'return RedirectToRoute (« CheckoutCompleted »);' не был выполнен после 'response.End()' – ClayKaboom
У меня такая же проблема , но пока не вижу решения. Если я поставлю Response.Write («somestring»); Response.End(); в контроллере у меня не возникло проблем. Но если я использую это в классе, я получаю ошибку, независимо от того, что я использую в классе. Я попытался: (1) передать HttpContext из контроллера в метод (2), передав ControllerContext в метод, а затем использовать HttpContext и (3) HttpContext.Current. Все это не сработало. – Mounhim