C# 如何将用户重定向到外部站点';在ASP.Net MVC中通过ActiveResult进行响应?
标题一定很混乱,我不确定我写对了。这是我的情况。我有一些动作控制器。我想做的是使用C# 如何将用户重定向到外部站点';在ASP.Net MVC中通过ActiveResult进行响应?,c#,asp.net,asp.net-mvc,webclient,C#,Asp.net,Asp.net Mvc,Webclient,标题一定很混乱,我不确定我写对了。这是我的情况。我有一些动作控制器。我想做的是使用WebClient将一些数据发布到外部站点,并将用户重定向到外部站点对此帖子的响应。到目前为止,我得到了如下结果:我得到了类似字节数组的响应,并将其转换为FileContentResult。但我真的不确定这是否正确,因为我希望用户在发布帖子后在外部站点上,在那个里做一些事情,然后他将被重定向回我的站点。我正在实施支付系统,我确信有一些随意的、更正确的实施方式,但不象以下方式: public ActionResult
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>
public PartialViewResult操作()
{
var模型=新模型{Arg1=“val1”,Arg2=“val2”,Url=”http://external-site.com/some-service"};
返回局部视图(模型);
}
@Html.HiddenFor(m=>m.Arg1)
@Html.HiddenFor(m=>m.Arg2)
在这种情况下,
Arg1
和Arg2
基本上是发票金额、货币等。但在我的情况下,有些值我不想以呈现的html发送给用户,所以我想通过WebClient
在controller中发布,但我不确定如何正确处理外部响应并重定向用户,根据此回复。我不太确定我是否遵循了,但我不明白是否需要从控制器的“WebClient”操作方法发出post请求。直接从您的视图发出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\u SERIALIZABLE_DATACONTRACT
只是一个XML SERIALIZABLE对象,您必须使用XmlRoot
等来定义它
让我知道它是否有意义我不太确定我是否遵循了,但我不明白是否需要使用“WebClient”从控制器操作方法发出post请求。直接从您的视图发出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\u SERIALIZABLE_DATACONTRACT
只是一个XML SERIALIZABLE对象,您必须使用XmlRoot
等来定义它
让我知道它是否有意义实际上我刚刚编辑了我的文章。有些值我不想让用户看到。即使它们在隐藏的字段中,它们仍然可以访问和读取。Dmytro,我认为你无法完成你的计划。即使您将响应发送给用户,您的用户也很可能从此无法执行任何操作,因为大多数支付网关将验证其服务器上发布的任何内容,以防伪造攻击。我仍在努力理解为什么您不能将此数据放在表单中。我的意思是,用户看不到它有多敏感?他们可以用这些信息做什么?支付系统要求商户代码和身份验证代码与发票详细信息(货币、金额、成功/失败URL等)一起过账,以便商户登录其系统。我不希望这些商家和身份验证码对用户可见。这听起来非常脆弱和不安全。如果发票处理只是发布数据并等待支付网关的响应,那就没问题了,要求最终用户进行额外处理是荒谬的。这似乎没有一个安全的方法。它是什么支付系统?实际上我刚刚编辑了我的帖子。有些值我不想让用户看到。即使它们在隐藏的字段中,它们仍然可以访问和读取。Dmytro,我认为你无法完成你的计划。即使您将响应发送给用户,您的用户也很可能从此无法执行任何操作,因为大多数支付网关将验证其服务器上发布的任何内容,以防伪造攻击。我仍在努力理解为什么您不能将此数据放在表单中。我的意思是,用户看不到它有多敏感?他们可以用这些信息做什么?支付系统要求商户代码和身份验证代码与发票详细信息(货币、金额、成功/失败URL等)一起过账,以便商户登录其系统。我不希望这些商家和身份验证码对用户可见。这听起来非常脆弱和不安全。如果发票处理只是发布数据并等待支付网关的响应,那就没问题了,要求最终用户进行额外处理是荒谬的。这似乎没有一个安全的方法。它是什么支付系统?应该吗