Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将用户重定向到外部站点';在ASP.Net MVC中通过ActiveResult进行响应?_C#_Asp.net_Asp.net Mvc_Webclient - Fatal编程技术网

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等)一起过账,以便商户登录其系统。我不希望这些商家和身份验证码对用户可见。这听起来非常脆弱和不安全。如果发票处理只是发布数据并等待支付网关的响应,那就没问题了,要求最终用户进行额外处理是荒谬的。这似乎没有一个安全的方法。它是什么支付系统?应该吗