ASP.NET MVC 3 - замена ответа HttpContext не работает - PullRequest
4 голосов
/ 10 января 2012

Я использую NopCommerce, которая недавно была обновлена ​​для использования MVC3 - ранее она использовала веб-формы.Я пытаюсь подключиться к сайту Worldpay (платежный шлюз).Процесс немного запутанный, но, по сути, необходимо отправить форму в Worldpay, а затем пользователь перенаправляется на свой хостинговый сайт, чтобы заполнить данные своей кредитной карты и т. Д.

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();

. Это прекрасно работает в версии веб-форм, но не работает в версии MVC.Там нет ошибки, и все, кажется, работает правильно.Однако обработка продолжается, и выполнение возвращается из уровня обслуживания (в котором расположен этот метод) к контроллеру, и выдается следующее перенаправление:

 return RedirectToRoute("CheckoutCompleted");

Работает ли MVC иначе, чем веб-формы, в отношении изменения ответана стороне сервера?Я попробовал следующий код и могу подтвердить, что 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 длина ответа) экран.Ниже приведено действие index на домашнем контроллере, которое вызывает указанную проблему.Тот же самый код в одноразовом проекте, который я создал, отлично работает ...

  public ActionResult Index()
  {    
            Response.Write("test");
            Response.End();
            return View(_storeInformationSettings);
  }

1 Ответ

0 голосов
/ 17 апреля 2013

Если вы измените свой третий фрагмент кода, вы можете оставить Response.Write и Response.End вне вашего контроллера.

HttpContext.Current.Response.Clear();
var webClient = new WebClient();
var responseBytes = webClient.UploadValues(Url, "POST", _inputValues);
var response = Encoding.UTF8.GetString(responseBytes);
HttpContext.Current.Response.Write(response);
HttpContext.Current.ApplicationInstance.CompleteRequest();

HttpContext.Current.ApplicationInstance.CompleteRequest (); помог мне. См. Также хороший пост об этом блоге MSDN о Response.End и Response.Close

...