需要帮助MVC工作流程 - 发布到另一台服务器?

时间:2011-07-07 19:10:15

标签: asp.net-mvc-3 redirect

我有一个表单,我正在收集电子商务应用程序的联系信息(姓名,地址等)。当用户单击“购买”按钮时,我想解析表单,获取几个值,并生成加密指纹。

然后我想从发布的表单中获取所有表单值(名称,地址等),并将其重定向到具有相同表单值的新服务器。我可能需要在幕后注入一些新的。

点击后捕获信息没问题。我只是在我的控制器上使用Buy操作。我无法弄清楚的部分是使用所需的参数发布到其他服务器。

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

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

编辑:澄清。我不需要发布数据,实际上我需要在浏览器中显示响应。

3 个答案:

答案 0 :(得分:5)

您可以使用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对象,了解该帖子发生了什么,如果这对您有用。

答案 1 :(得分:4)

好的伙计们,这就是我最终做的事情,而且效果很好。

出于本讨论的目的,有2个视图。成员资格从用户收集信息,而Buy执行帖子到第三方服务器。

当用户单击Membership视图上的OK按钮时,下面的第一个代码块将被执行 - Membership操作上的HttpPost。如有必要,此处将处理信息,然后将其保存在TempData中,以便将其传递到“购买”视图。然后它将控制重定向到Buy视图。

在Buy操作中,下面的第二个代码块被执行。在这里,我可以抓住会员收集的东西,做我需要做的事情。然后将所有表单数据复制到ViewData []值中。您可以使用模型而不是ViewData,但我在模型中还有其他东西。可能可能将它们组合在一起,但这很有效。

最后,在“购买”视图中,使用ViewData值设置所有表单字段值。关键是使用jQuery .ready处理程序,以便在页面加载完成后自动提交表单。

因此,这基本上将表单值从Membership视图复制到Buy视图,添加一些新值,然后将其全部发布到第三方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 :(得分:2)

您可以将值发布到另一个网址并在同一帖子中重定向(即将用户返回到帖子的结果页面)的唯一方法是实际让用户浏览器执行帖子。你也在用HTTPS发帖子,所以重点是要防止中间人的事情。

唯一真正的方法是将新表单返回给用户,并以编程方式告诉浏览器使用带有新值的javascript提交它。