如何通过ASP .Net MVC中的ActioResult将用户重定向到外部站点的响应?

时间:2013-12-20 03:17:30

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

那么标题必须非常混乱,我不确定我写得对。这是我的情况。我有控制器有一些动作。我想要做的是使用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,但我不确定如何正确处理外部响应并重定向用户,根据此响应。

1 个答案:

答案 0 :(得分:4)

我不太确定我是否关注但我不明白需要使用'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等来定义。

让我知道它是否有意义