那么标题必须非常混乱,我不确定我写得对。这是我的情况。我有控制器有一些动作。我想要做的是使用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>
在这种情况下,Arg1
和Arg2
基本上是发票金额,货币等。但在我的情况下有一些值我不想在渲染的HTML中发送给用户所以我想制作这个帖子在控制器中通过WebClient
,但我不确定如何正确处理外部响应并重定向用户,根据此响应。
答案 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
等来定义。
让我知道它是否有意义