【问题标题】:How to redirect user to external site's response via ActioResult in ASP .Net MVC?如何通过 ASP .Net MVC 中的 ActionResult 将用户重定向到外部站点响应?
【发布时间】:2013-12-20 03:17:30
【问题描述】:

嗯,标题一定很混乱,我不确定我写对了。这是我的情况。我有一些动作的控制器。我想要做的是使用WebClient 将一些数据发布到外部站点,并将用户重定向到外部站点对此帖子的响应。到目前为止,我得到以下内容:我得到像字节数组一样的响应并将其转换为FileContentResult。但我真的不确定这是否正确,因为我希望用户在发布后在外部网站上,在那里做一些事情,然后他将被重定向回我的网站。我正在实施支付系统,我确信有一些随意且更正确的实施方式,但不像以下:

public ActionResult Action()
{
    var data = new NameValueCollection()
    {
        { "arg1", "val1" },
        { "arg2", "val2" }
    };
    using (WebClient client = new WebClient())
    {    
       byte[] response = client.UploadValues("http://external-site.com/some-service",data);
       return new FileContentResult(response, "text/html");
   }
}

作为一个选项,我可以(我之前做过)创建部分视图小部件,使用该小部件将数据发布到外部站点,并将所有必要的数据写入隐藏输入,如下所示:

public PartialViewResult Action()
{
   var model = new Model {Arg1 = "val1", Arg2 = "val2", Url = "http://external-site.com/some-service"};
   return PartialView(model);
}

<form action='@Model.Url' method="POST">
    @Html.HiddenFor(m => m.Arg1)
    @Html.HiddenFor(m => m.Arg2)
    <input type="submit" value="Pay with blah-blah">
</form>

在这种情况下,Arg1Arg2 基本上是发票金额、货币等。但在我的情况下,有些值我不想在呈现的 html 中发送给用户,所以我想在控制器中发布这篇文章通过WebClient,但我不确定如何正确处理外部响应并根据此响应重定向用户。

【问题讨论】:

  • 是否应该打电话给您的控制器来发帖?我建议您可以使用 Jquery 跨域 Ajax - api.jquery.com/jQuery.ajax(如果您已经在使用 jquery)。这样您就不必担心发回响应...
  • @SridharVenkat,我希望从控制器拨打电话。

标签: c# asp.net asp.net-mvc webclient


【解决方案1】:

我不太确定我是否在关注,但我不明白需要使用“WebClient”从您的控制器操作方法发出发布请求。直接从你的视图发出 post 请求不是更整洁吗?

我建议在您的视图中放置一个表单,将这些数据直接发布到外部网站

希望有意义

根据评论编辑

@Dmytro,您不需要将响应的内容发送给用户。这是错误的,您最终会向用户发送敏感信息。您需要做的是在 POST 请求中发送所需的 XML,解析也是 xml 的响应,然后将用户重定向到 NavigateUrl 元素中提供的 url。

顺便说一句,我在这里放了一个简约的代码示例......

try
{
    byte[] formContentBytes = System.Text.ASCIIEncoding.UTF8.GetBytes("your xml request content");

    System.Net.WebRequest request = System.Net.WebRequest.Create(string.Format("https://merchantapi.apac.paywithpoli.com/MerchantAPIService.svc/Xml/transaction/initiate"));
            request.Method = "POST";
            request.ContentType = "text/xml";
            request.ContentLength = formContentBytes.Length;

            var reqStream = request.GetRequestStream();
            reqStream.Write(formContentBytes, 0, formContentBytes.Length);


            var response = request.GetResponse();
            XmlSerializer serializer = new XmlSerializer(typeof(YOUR_XML_SERIALIZABLE_DATACONTRACT));
            YOUR_XML_SERIALIZABLE_DATACONTRACT responseData = serializer.Deserialize(response.GetResponseStream());

            reqStream.Close();
            response.Close();
}
catch(Exception ex){}

请注意,YOUR_XML_SERIALIZABLE_DATACONTRACT 只是一个 xml 可串行化对象,您必须使用 XmlRoot 等来定义它。

让我知道这是否有意义

【讨论】:

  • 其实我只是编辑了我的帖子。有些值我不想对用户可见。即使它们位于隐藏字段中,它们仍然可以访问并且可以读取。
  • Dmytro,我认为您无法按照您的计划进行。即使您将响应发送给用户,您的用户也很可能从那时起将无法执行任何操作,因为这些支付网关中的大多数都会验证发布在其服务器上的任何内容以防伪造攻击。
  • 我仍然很难理解为什么不能将这些数据放入表单中。我的意思是,用户看不到它有多敏感?他们可以用这些信息做什么?
  • 支付系统需要将商家代码和验证代码与发票详细信息(货币、金额、成功/失败 URL 等)一起发布,以将商家登录到他们的系统。我不希望这些商家和身份验证代码对用户可见。
  • 这听起来非常脆弱和不安全。如果发票处理只是发布数据并等待支付网关回复的问题,那会很好,要求最终用户进行额外处理是荒谬的。似乎没有一种安全的方法可以做到这一点。它是什么支付系统?
猜你喜欢
  • 2022-01-01
  • 2016-03-05
  • 2012-01-27
  • 2015-06-23
  • 1970-01-01
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多