Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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# C中的cXML PunchOutSetupRequest和PunchOutSetupResponse示例#_C#_Cxml - Fatal编程技术网

C# C中的cXML PunchOutSetupRequest和PunchOutSetupResponse示例#

C# C中的cXML PunchOutSetupRequest和PunchOutSetupResponse示例#,c#,cxml,C#,Cxml,我正在尝试在eComm网站上实现punchout目录。老实说,cXML的文档非常混乱,所有代码示例都是javascript和/或VB.Net(我使用C#,不必尝试翻译)。是否有人提供了如何接收PunchOutSetupRequest XML,然后使用C#发送PunchOutSetupResponse XML的示例或示例?我在互联网上找不到任何东西(我已经找了两天了) 我希望我能在ActionResult中做到这一点(与建议的“启动页面”相比) 我在punchouts是个十足的笨蛋,这里真的需要一

我正在尝试在eComm网站上实现punchout目录。老实说,cXML的文档非常混乱,所有代码示例都是javascript和/或VB.Net(我使用C#,不必尝试翻译)。是否有人提供了如何接收PunchOutSetupRequest XML,然后使用C#发送PunchOutSetupResponse XML的示例或示例?我在互联网上找不到任何东西(我已经找了两天了)

我希望我能在ActionResult中做到这一点(与建议的“启动页面”相比)

我在punchouts是个十足的笨蛋,这里真的需要一些帮助。老板们很有进取心,所以任何帮助都将不胜感激。关于如何开展这项工作的建议也将不胜感激


我为问题(请求)的模糊性向所有人道歉。

这不是小事,但这应该让你开始

您将需要3个通用处理程序(.ashx):设置、启动和排序

安装程序和订单将收到内容类型为“text/xml”的HTTP Post。如果需要将XML转换为字符串,请查看HttpRequest.InputStream。从这里开始,查看LINQ到XML,以挖掘出所需的数据。您对这两种格式的HTTP响应也将是内容类型“text/xml”和UTF8编码,返回文档中的CXML…使用LINQ to xml生成该响应

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

启动处理程序将作为简单GET调用,并且需要将QueryString中的令牌与适当的应用程序对象相匹配,将该数据复制到会话,然后执行响应。重定向到站点中您希望买家登录的任何页面

一旦他们用一些东西填充他们的购物车并准备好签出,您将把他们带到一个页面,该页面有一个嵌入表单(不要与回发到服务器的ASP.Net表单混淆)和一个提交按钮(同样,不是ASP.Net按钮)。从安装程序处理程序中,您捕获了一个指向此表单帖子的URL,在表单中,您将有一个隐藏的输入标记,该标记使用UTF8编码的CXML Punchout顺序作为LINQ to XML生成的值注入。强烈建议对该值进行Base64编码,以避免ASP.Net在呈现期间弄乱它包含的标记,并根据文档将隐藏的输入命名为“cxml-Base64”。结果是表单被客户端发布到客户的服务器,而不是您的服务器,他们的服务器将提取CXML Punchout订单,从而结束访问者的会话

订单处理程序将接收一个CXML OrderRequest,就像安装程序一样,您将把它转储到一个字符串中,然后使用LINQ to XML解析它并对其执行操作。同样,您将获得要验证的凭据,可能是要处理的信用卡,以及订单项目、发货地点等。请注意,OrderRequest可能不包含Punchout订单中的所有项目,因为在向您提交最终OrderRequest之前,客户方的系统可能会删除项目,甚至更改项目数量。OrderRequest可能在Punchout订单在几分钟、几天、几周或几天内发送给他们后返回给您……不要费心存储购物车数据,希望稍后将其与订单匹配

最后一点注意……买家可能在其基于web的采购UI中嵌入的iframe中体验您的网站,因此请进行相应的设计

如果你需要更多的信息,回复这个,我会回来的

更新…其他注意事项: 与买方讨论他们希望如何处理故障,尤其是订单,因为您有选择权。1) 全面评估您收到的CXML中的所有内容,如果有任何错误,则返回200以外的响应代码,或者2)始终返回200成功,并处理带外的任何问题,或者生成拒绝订单的确认请求。我的经验是,两者的结合效果最好。当然,如果凭据失败,您应该抛出一个非200,但您可能不希望(或无法)运行信用卡或在线验证股票可用性。您的买方系统可能无法处理几十个可能的故障,和/或可能无法向用户显示故障消息,以便他们进行纠正。我见过一些系统会完全放弃任何非200响应代码,只是在几个小时或几天的时间间隔内盲目地重复重试提交,直到放弃健全性检查,而其他系统会在某些范围内以不同于其他系统的方式处理响应代码,例如4xx调用重试,而5xx被视为致命。请记住,设置和订单不是直接来自用户……他们的采购系统是在内部生成这些设置和订单的


更新…回答有关如何测试的评论

您将使用与生成outbound ConfirmationRequest、ShipNoticeRequest和InvoiceDetailRequest相同的方法,所有这些通常都是在收到客户采购系统的订单请求后由您自己生成的

以创建传出的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开始的Web应用程序项目和一个default.aspx页面将在localhost和一些端口上侦听(您将在它打开的URL中看到)。另外,也许使用VS Express for Desktop,您可以在控制台应用程序中运行上述代码,并使用类似以下内容执行帖子:

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();
因为你的处理器应该是produ