Нужна помощь с рабочим процессом MVC - отправить на другой сервер? - PullRequest
3 голосов
/ 07 июля 2011

У меня есть форма, где я собираю контактную информацию (имя, адрес и т. Д.) Для приложения электронной коммерции.Когда пользователь нажимает кнопку «Купить», я хочу проанализировать форму, получить пару значений и создать криптографический отпечаток.

Затем я хочу взять все значения формы (имя, адрес и т. Д.) Из опубликованной формы и перенаправить ее на новый сервер с такими же значениями формы.Мне может понадобиться добавить несколько новых за кулисами.

Нет проблем с получением информации после щелчка.Я просто использую действие Buy на моем контроллере.Часть, которую я не могу понять, это публикация на другом сервере с нужными параметрами.

[HttpPost]
public ActionResult Buy(BuyModel model)
{
    var fingerprint = GenerateFingerprint(.....);

    return Redirect("https://some.other.url.com/");
}

РЕДАКТИРОВАТЬ: Чтобы уточнить.Мне не нужно просто публиковать данные, мне нужно отобразить ответ в браузере.

Ответы [ 3 ]

5 голосов
/ 07 июля 2011

Вы можете использовать класс HttpWebRequest , чтобы отправить сообщение на другой сервер, а затем перенаправить в обычном режиме.

var httpRequest = (HttpWebRequest)WebRequest.Create("http://example.com/mypage/;
httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded";

Для данных записи вы захотите преобразовать эток byte[] и затем добавьте его к stream.

string postData = "key=value&key2=value2";
byte[] dataArray = Encoding.UTF8.GetBytes(postData);

. После этого вы сможете правильно установить ContentLength запроса:

httpRequest.ContentLength = dataArray.Length;

Напишите этона Stream, и мы хорошо сделаем сообщение:

 using(Stream requestStream = httpRequest.GetRequestStream())
{
    requestStream.Write(dataArray, 0, dataArray.Length);
    var webResponse = (HttpWebResponse)httpRequest.GetResponse();
}

Предполагая, что вам не нужно перенаправлять пользователя на опубликованную страницу, это будет хорошо работать.Вы можете заглянуть в объект webResponse, чтобы узнать, что случилось с постом, если это полезно для вас.

4 голосов
/ 15 июля 2011

Хорошо, ребята, вот что я в итоге сделал, и это прекрасно работает.

Для целей этого обсуждения есть 2 просмотра.Членство собирает информацию от пользователя, а Buy выполняет публикацию на стороннем сервере.

Когда пользователь нажимает кнопку «ОК» в представлении «Членство», выполняется первый блок кода ниже - HttpPost в действии «Членство».Здесь информация обрабатывается при необходимости, а затем сохраняется в TempData, чтобы ее можно было передать в представление Buy.Затем он перенаправляет управление в представление Buy.

В действии Buy выполняется второй блок кода ниже.Здесь я могу взять материал, собранный в членстве, и делать все, что мне нужно.Затем скопируйте все данные формы в значения ViewData [].Вы можете использовать модель вместо ViewData, но у меня есть другие вещи в модели.Возможно, их можно было бы объединить, но это работает.

Наконец, в представлении Buy установите все значения полей формы, используя значения ViewData.Однако ключом является использование обработчика jQuery .ready, чтобы форма автоматически отправлялась после завершения загрузки страницы.

Таким образом, это в основном копирует значения формы из представления «Членство» в представление «Купить», добавляет несколько новых значений и затем публикует их все по стороннему URL-адресу.

BuyController.cs

    [HttpPost]
    public ActionResult Membership(OtherModel model)
    {
        // do some stuff with the model
        // ...

        TempData["OtherModel"] = model;       

        return RedirectToAction("Buy");
    }

...

    public ActionResult Buy()
    {
        // do some stuff to generate crypto key
        var fingerprint = DoSomeStuff();

        ViewData["x_fp_hash"] = fingerprint;

        var otherstuff = (OtherModel) TempData["OtherModel"];
        ViewData["x_login"] = otherstuff.login;


        return View(model);
    }

Buy.cshtml

@{
    Layout = "~/Views/Shared/_LayoutBlank.cshtml";
    ViewBag.Title = "Validating ...";
}

<script type='text/javascript'>
    $(function () {
        $("form#simForm").submit();
    });
</script>


@model My.Namespace.MyModel


    <form id="simForm" runat="server" method='post' action='https://xxxxxx.net/url/transact.dll'>
        <input type='hidden' runat="server" name='x_login' id='x_login' value="@ViewData["x_login"]" />
        <input type='hidden' runat="server" name='x_fp_hash' id='x_fp_hash'value="@ViewData["x_fp_hash"]"/>

        etc.

    </form>
2 голосов
/ 07 июля 2011

Единственный способ, которым вы можете опубликовать значения на другой URL и перенаправить в том же сообщении (то есть вернуть пользователя на полученную страницу сообщения), - это заставить браузер пользователей делать сообщение. Вы также делаете сообщение для HTTPS, так что весь смысл в том, чтобы предотвратить вещи типа «человек посередине».

Единственный реальный способ сделать это - вернуть новую форму пользователю и программно сказать браузеру отправить ее, используя javascript с новыми значениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...