题
我正在 ASP.NET 中做一个电子商务解决方案,它使用 PayPal 网站支付标准 服务。除此之外,我还使用他们提供的服务(支付数据传输)在用户完成付款后向您发送回订单信息。我需要做的最后一件事是解析来自他们的 POST 请求并将信息保留在其中。HTTP 请求的内容采用以下形式:
成功
名字=简+多伊
姓氏=史密斯
payment_status=已完成
payer_email=janedoesmith%40hotmail.com
付款总额=3.99
mc_currency=美元
定制=用于+购买+的+稀有+书+绿色+鸡蛋+%26+火腿
基本上我想解析这些信息并做一些有意义的事情,例如通过电子邮件发送或将其保存在数据库中。我的问题是在 ASP.NET 中解析原始 HTTP 数据的正确方法是什么,而不是解析本身是如何完成的。
解决方案
像这样的东西放在你的 onload 事件中。
if (Request.RequestType == "POST")
{
using (StreamReader sr = new StreamReader(Request.InputStream))
{
if (sr.ReadLine() == "SUCCESS")
{
/* Do your parsing here */
}
}
}
请注意,他们可能需要某种特殊的回应(即;不是您的完整网页),因此您可以在完成解析后执行类似的操作。
Response.Clear();
Response.ContentType = "text/plain";
Response.Write("Thanks!");
Response.End();
更新:这应该在通用处理程序 (.ashx) 文件中完成,以避免页面模型产生大量开销。查看 本文 有关 .ashx 文件的更多信息
其他提示
使用 IHttpHandler 并避免页面模型开销(您不需要),但使用 Request.Form 来获取值,这样您就不必自己解析名称值对。假设您使用的是 PHP 或经典 ASP(或 ASP.NET MVC)。;)
我强烈建议将每个请求保存到某个文件中。
这样,您以后随时可以返回到它的实际内容。稍后,当您发现敌对字节序、koi-8 编码、[...],无论是什么困扰了您的解析器时,您可以感谢我...
如果传入的数据采用标准表单编码的 POST 格式,那么使用 Request.Form 数组将以一种易于处理的方式为您提供所有数据。
如果没有,那么除了使用 Request.InputStream 之外我看不到任何方法。
如果我没理解你的问题,我想你正在寻找 输入流属性 在请求对象上。请记住,这是一个消防流,因此您无法重置它。