C#中的cXML PunchOutSetupRequest和PunchOutSetupResponse示例

时间:2014-08-26 21:39:56

标签: c# cxml

我正在尝试在我们的eComm网站上实施打孔目录。老实说,cXML的文档很乱,所有代码示例都在javascript和/或VB.Net中(我使用C#而不必尝试翻译)。有没有人有关于如何接收PunchOutSetupRequest XML然后使用C#发送PunchOutSetupResponse XML的示例或示例?我一直无法在互联网上找到任何东西(我现在已经找了两天了)......

我希望我能在ActionResult中执行此操作(与建议的“启动页面”相比)。

我在击球时是一个完整的菜鸟,可以在这里使用一些帮助。老板们非常咄咄逼人,所以任何帮助都会非常感激。关于如何完成这项工作的建议也将不胜感激。

我向所有人道歉,因为问题含糊不清(请求)。

1 个答案:

答案 0 :(得分:21)

这不是一件小事,但这应该可以让你开始。

您需要3个通用处理程序(.ashx):设置,启动和订购....

设置和订单将收到内容类型为" text / xml"的HTTP帖子。如果需要,请查看HttpRequest.InputStream以将XML转换为字符串。从那里,查看LINQ-to-XML以挖掘出您想要的数据。您对这两者的HTTP响应也将是内容类型" text / xml"和UTF8编码,返回CXML文档...使用LINQ-to-XML来生成。

安装程序处理程序需要验证凭据并返回带有指向Start处理程序的唯一QueryString标记的URL。不要指望安装程序和启动之间的会话持久性,因为它们不是来自同一个调用者。此处理程序将需要为您从cXML中提取的令牌和关联数据创建应用程序对象。

Start处理程序将被称为简单GET,并且需要将QueryString中的标记与相应的应用程序对象匹配,将该数据复制到会话,然后执行response.redirect到您站点中的任何页面你希望买家登陆。

一旦他们用一些东西填充他们的购物车并且准备结账,您将把他们带到一个嵌入式表格的页面(不要与发布回您的ASP.Net表单混淆服务器)和提交按钮(再次,不是ASP.Net按钮)。在您的安装程序处理程序中,您捕获了一个URL以指向此表单的帖子,并且在表单中您将有一个隐藏的输入标记,其中UTF8编码的CXML Punchout Order被注入为LINQ-to-生成的值XML。强烈建议使用Base64编码这个值,以避免ASP.Net在渲染过程中弄乱它包含的标签,并命名隐藏的输入" cxml-base64"根据文件。结果是表单是客户端发布给客户的服务器而不是您的服务器,他们的服务器将提取CXML Punchout Order并结束访问者的会话。

Order处理程序将接收CXML OrderRequest,就像安装程序一样,您将其转储到字符串,然后使用LINQ-to-XML解析它并对其进行操作。您再次获得凭据以验证,可能是要处理的信用卡,以及订单商品,交运地等。请注意,OrderRequest可能不包含Punchout订单中的所有商品,因为系统处于开启状态在向您提交最终OrderRequest之前,您的客户可能会删除商品甚至更改商品数量。订单请求可以在几分钟,几天,几周或从未发布过Punchout Order之后回复给您。不要打算存储购物车数据,以便稍后将其与订单匹配。

最后注意......买方可能会在基于网络的采购用户界面中嵌入iframe中遇到您的网站,因此请进行相应的设计。

如果您需要更多信息,请回复此信息,然后我会回来。

更新......其他注意事项: 与买家讨论他们希望故障处理如何流动,尤其是订单,因为您可以选择。 1)详尽地评估您收到的CXML中的所有内容,如果出现任何问题,则返回200以外的响应代码;或2)始终返回200 Success并处理带外问题或生成拒绝订单的ConfirmationRequest。我的经验是两者的结合最好。当然,如果凭证失败,您应该抛出非200,但您可能不希望(或能够)运行信用卡或内联验证库存可用性。您的买方系统可能无法应对数十种可能的故障,和/或可能无法向用户显示您的故障消息,以便他们进行更正。我已经看到系统会逐渐丢弃任何非200响应代码,并且只是在几个小时或几天的间隔内反复重复提交,直到它放弃进行健全性检查,而其他人则会在特定范围内处理响应代码范围与其他范围不同,例如4xx调用重试,而5xx被视为致命。请记住,安装和订单不是直接来自用户...他们的采购系统正在内部生成这些。


更新......回答关于如何测试的评论...

您将使用与生成出站ConfirmationRequest,ShipNoticeRequest和InvoiceDetailRequest相同的方法,所有这些通常都是在您从客户的采购系统收到OrderRequest后生成的。

Linq-To-XML开始,以获取制作传出cXML(创建XML树部分)的示例。将该示例与这段代码结合起来:

StringBuilder output = new StringBuilder();

XmlWriterSettings objXmlWriterSettings = new XmlWriterSettings();
objXmlWriterSettings.Indent = true;
objXmlWriterSettings.NewLineChars = Environment.NewLine;
objXmlWriterSettings.NewLineHandling = NewLineHandling.Replace;
objXmlWriterSettings.NewLineOnAttributes = false;
objXmlWriterSettings.Encoding = new UTF8Encoding();

using (XmlWriter objXmlWriter = XmlWriter.Create(output, objXmlWriterSettings)) {
    XElement root = new XElement("Root",
        new XElement("Child", "child content")
    );
    root.Save(objXmlWriter);
}
Console.WriteLine(output.ToString());

所以在这一点上StringBuilder(输出)有你的整个cXML,你需要在某个地方发布它。您使用F5和default.aspx页面启动的Web应用程序项目将在localhost和某个端口上进行侦听(您将在其打开的URL中看到它)。另外,也许使用VS Express for Desktop,您可以在控制台应用程序中使用上述代码,您可以使用以下内容运行Post:

Net.HttpWebRequest objRequest = Net.WebRequest.Create("http://localhost:12345/handler.ashx");

objRequest.Method = "POST";
objRequest.UserAgent = "Some User Agent";
objRequest.ContentLength = output.Length;
objRequest.ContentType = "text/xml";

IO.StreamWriter objStreamWriter = new IO.StreamWriter(objRequest.GetRequestStream, System.Text.Encoding.ASCII);
objStreamWriter.Write(output);
objStreamWriter.Flush();
objStreamWriter.Close();

Net.WebResponse objWebResponse = objRequest.GetResponse();
XmlReaderSettings objXmlReaderSettings = new XmlReaderSettings();
objXmlReaderSettings.DtdProcessing = DtdProcessing.Ignore;
XmlReader objXmlReader = XmlReader.Create(objWebResponse.GetResponseStream, objXmlReaderSettings);

// Pipes the stream to a higher level stream reader with the required encoding format.  
IO.MemoryStream objMemoryStream2 = new IO.MemoryStream();
XmlWriter objXmlWriter2 = XmlWriter.Create(objMemoryStream2, objXmlWriterSettings);
objXmlWriter2.WriteNode(objXmlReader, true);
objXmlWriter2.Flush();
objXmlWriter2.Close();
objWebResponse.Close();

// Reset current position to the beginning so we can read all below.
objMemoryStream2.Position = 0;

StreamReader objStreamReader = new StreamReader(objMemoryStream2, Encoding.UTF8);
Console.WriteLine(objStreamReader.ReadToEnd());
objStreamReader.Close();

由于你的处理程序应该生成cXML,你会在控制台中看到spat out。如果它呕吐,你会在控制台中得到一大堆调试混乱,这当然会帮助你解决任何破坏的问题。

  • 请原谅变量名中的冗长,尽量让事情变得清晰。