2012-01-10 2 views
4

Я использую 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); 
    } 
+0

использовать скрипач для обоих и сравнить ответы. вопрос о том, «работает ли mvc по-разному», немного загружен, поскольку он зависит от того, что что-либо делает в конвейере веб-форм или против контроллера mvc. в общем, «нет», но это зависит от возвращаемого типа контента и т. д. –

+0

Я тестировал, и для меня это работало нормально. Я имею в виду, что я мог писать на экране с помощью 'response.Write()' и мой вызов 'return RedirectToRoute (« CheckoutCompleted »);' не был выполнен после 'response.End()' – ClayKaboom

+0

У меня такая же проблема , но пока не вижу решения. Если я поставлю Response.Write («somestring»); Response.End(); в контроллере у меня не возникло проблем. Но если я использую это в классе, я получаю ошибку, независимо от того, что я использую в классе. Я попытался: (1) передать HttpContext из контроллера в метод (2), передав ControllerContext в метод, а затем использовать HttpContext и (3) HttpContext.Current. Все это не сработало. – Mounhim

ответ

0

Если вы измените свой третий фрагмент кода, который вы можете оставить 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 Blog about Response.End and Response.Close

Смежные вопросы