我一直在阅读和阅读,但我越走越困惑。我正在用 C# 构建一个 ASP.NET 4.0 Web 应用程序。我正在尝试实现信用卡处理。我使用的公司提供了一个示例 XML SOAP 请求和响应,但我不知道该怎么做。我是一名新手开发人员,对这一切都很陌生。我只是不知道从哪里开始。非常感谢任何帮助,我也必须通过 SSL 发送,但这可能是另一个问题。
这是 SOAP 请求
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<v1:SendTranRequest xmlns:v1="http://postilion/realtime/merchantframework/xsd/v1/">
<v1:merc>
<v1:id>9000</v1:id>
<v1:regKey>RegistrationKey</v1:regKey>
<v1:inType>1</v1:inType>
<v1:prodType>5</v1:prodType>
</v1:merc>
<v1:tranCode>1</v1:tranCode>
<v1:card>
<v1:pan>411111******1111</v1:pan>
<v1:xprDt>1312</v1:xprDt>
</v1:card>
<v1:contact>
<v1:id>1234567</v1:id>
<v1:fullName>John Doe</v1:fullName>
<v1:coName>Ajax Intl.</v1:coName>
<v1:title>CEO</v1:title>
<v1:phone>
<v1:type>3</v1:type>
<v1:nr>5555555555</v1:nr>
</v1:phone>
<v1:addrLn1>123 1st St.</v1:addrLn1>
<v1:city>Somewhere</v1:city>
<v1:state>CO</v1:state>
<v1:zipCode>80021</v1:zipCode>
<v1:ctry>US</v1:ctry>
<v1:email>email@email.com</v1:email>
<v1:ship>
<v1:fullName>John Doe</v1:fullName>
<v1:addrLn1>123 1st St.</v1:addrLn1>
<v1:city>Somewhere</v1:city>
<v1:state>CO</v1:state>
<v1:zipCode>80021</v1:zipCode>
<v1:phone>5555555555</v1:phone>
<v1:email>email@email.com</v1:email>
</v1:ship>
</v1:contact>
<v1:reqAmt>099</v1:reqAmt>
<v1:usrDef>
<v1:name>firstname</v1:name>
<v1:val>John</v1:val>
</v1:usrDef>
<v1:indCode>1</v1:indCode>
<v1:tranFlags>
<v1:dupChkTmPrd>6000</v1:dupChkTmPrd>
<v1:convFeeAcptd>N</v1:convFeeAcptd>
</v1:tranFlags>
<v1:tax>
<v1:idcr>0</v1:idcr>
</v1:tax>
</v1:SendTranRequest>
</soapenv:Body>
</soapenv:Envelope>
这是我的创建请求和读取响应
WebRequest webRequest = WebRequest.Create("url");
HttpWebRequest httpRequest = (HttpWebRequest)webRequest;
httpRequest.Method = "POST";
httpRequest.ContentType = "text/xml; charset=utf-8";
httpRequest.Headers.Add("SOAPAction: http://tempuri.org/");
httpRequest.ProtocolVersion = HttpVersion.Version11;
httpRequest.Credentials = CredentialCache.DefaultCredentials;
//build xml
var xmlWriterSettings = new XmlWriterSettings
{
NewLineHandling = NewLineHandling.None,
Encoding = Encoding.ASCII
};
using (var requestStream = httpRequest.GetRequestStream())
using (var writer = XmlWriter.Create(requestStream, xmlWriterSettings))
{
xml.WriteTo(writer);
}
//Get the Response
HttpWebResponse wr = (HttpWebResponse)httpRequest.GetResponse();
StreamReader srd = new StreamReader(wr.GetResponseStream());
string resulXmlFromWebService = srd.ReadToEnd();
最佳答案
我建议查看 HttpWebRequest
和 HttpWebResponse
类。 HttpWebRequest
类将允许您设置请求的主体、 header 、凭据和其他内容。和 HttpWebResponse
应该允许您阅读所需的任何信息。
希望这对一些人有所帮助,但是您的问题不清楚您需要做什么。但是以下代码将从您已将请求 XML 发布到的提供的端点下载 XML 文档。
var requestXml = new XmlDocument();
// build XML request
var httpRequest = HttpWebRequest.Create("https://www.website.com/");
httpRequest.Method = "POST";
httpRequest.ContentType = "text/xml";
// set appropriate headers
using (var requestStream = httpRequest.GetRequestStream())
{
requestXml.Save(requestStream);
}
using (var response = (HttpWebResponse)httpRequest.GetResponse())
using (var responseStream = response.GetResponseStream())
{
// may want to check response.StatusCode to
// see if the request was successful
var responseXml = new XmlDocument();
responseXml.Load(responseStream);
}
至于处理通过 SSL/TLS 做的事情,你很幸运,.NET 会为你处理好,你只需要指定
https
超过 http
在您提供给 HttpWebRequest.Create
的 URL 中.构建 XML 的方法有很多种,其中一种方法是使用
XElement
, XAttribute
, 和 XNamespace
System.Xml.Linq
中的对象命名空间。除非您至少不能使用 .NET 3.5,否则我建议您使用。由于您是在 APS.NET 4.0 中创建应用程序,因此这应该不是问题。当您创建
XElement
并且您需要指定一个命名空间,您首先需要创建一个 XNamespace
目的。var ns = XNamespace.Get("http://tempuri.com");
var root = new XElement(ns + "Root", "Body");
这将产生以下 XML:
<Root xmlns="http://tempuri.com">Body</Root>
但是,您需要能够指定命名空间前缀。为此,您需要添加
XAttribute
反对XElement
您首先使用前缀并通过构造函数指定前缀。var ns = XNamespace.Get("http://tempuri.com");
var root = new XElement(ns + "Root",
new XAttribute(XNamespace.Xmlns + "prefix", ns)
"Body"
);
这将产生以下 XML:
<prefix:Root xmlns:prefix="http://tempuri.com">Body</prefix:Root>
这是使用这些对象构造的 XML 的一部分。
var id = 9000;
var regKey = "RegistrationKey";
var inType = 1;
var prodType = 5;
var tranCode = 1;
var soapNs = XNamespace.Get("http://schemas.xmlsoap.org/soap/envelope/");
var v1Ns = XNamespace.Get("http://postilion/realtime/merchantframework/xsd/v1/");
var xml= new XElement(soapNs + "Envelope",
new XAttribute(XNamespace.Xmlns + "soapenv", soapNs),
new XElement(soapNs + "Body",
new XElement(v1Ns + "SendTranRequest",
new XAttribute(XNamespace.Xmlns + "v1", v1Ns),
new XElement(v1Ns + "merc",
new XElement(v1Ns + "id", id),
new XElement(v1Ns + "regKey", regKey),
new XElement(v1Ns + "inType", inType),
new XElement(v1Ns + "prodType", prodType)
),
new XElement(v1Ns + "tranCode", tranCode)
)
)
);
这会产生以下 XML:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<v1:SendTranRequest xmlns:v1="http://postilion/realtime/merchantframework/xsd/v1/">
<v1:merc>
<v1:id>9000</v1:id>
<v1:regKey>RegistrationKey</v1:regKey>
<v1:inType>1</v1:inType>
<v1:prodType>5</v1:prodType>
</v1:merc>
<v1:tranCode>1</v1:tranCode>
</v1:SendTranRequest>
</soapenv:Body>
</soapenv:Envelope>
将 XML 包含到您的
HttpWebRequest
的正文中做:var xmlWriterSettings = new XmlWriterSettings
{
NewLineHandling = NewLineHandling.None
};
using (var requestStream = httpRequest.GetRequestStream())
using (var writer = XmlWriter.Create(requestStream, xmlWriterSettings))
{
xml.WriteTo(writer);
}
这里需要注意的一件事是创建
XmlWriter
与 XmlWriterSettings
,这允许您在 XML 元素之间不包含任何空格。如果您需要空格,您可以创建 XmlWriter
只需调用XmlWriter.Create(stream)
如果您不能使用 .NET 3.5 或更高版本,您可以使用
XmlDocument
和 XmlElement
System.Xml
中的对象命名空间。出于您的目的,使用
XmlDocument
构建所需的 XML 将很容易。和 XmlElement
但这将是更多的代码。创建 XmlElement
您将需要一个 XmlDocument
创建对象。 XmlDocument.CreateElement
函数有一个重载,允许您同时指定命名空间前缀和命名空间,所以这更直接一点。使用
XmlDocument
时要注意的一件事和 XmlElement
您是否需要手动附加 XmlElement
构造完成后到适当的对象。另一件事是您不能指定 XmlElement
的正文。在施工期间,因此也需要在创建后完成。以这种方式构建 XML 的操作顺序无关紧要。它主要是确保您附加
XmlElement
到右父级,并设置 InnerText
右边XmlElement
目的。var soapPrefix = "soapenv";
var soapNs = "http://schemas.xmlsoap.org/soap/envelope/";
var v1Prefix = "v1";
var v1Ns = "http://postilion/realtime/merchantframework/xsd/v1/";
var xmlDoc = new XmlDocument();
var envelope = xmlDoc.CreateElement(soapPrefix, "Envelope", soapNs);
xmlDoc.AppendChild(envelope);
var body = xmlDoc.CreateElement(soapPrefix, "Body", soapNs);
envelope.AppendChild(body);
var sendTranRequest = xmlDoc.CreateElement(v1Prefix, "SendTranRequest", v1Ns);
body.AppendChild(sendTranRequest);
var merc = xmlDoc.CreateElement(v1Prefix, "merc", v1Ns);
sendTranRequest.AppendChild(merc);
var idElement = xmlDoc.CreateElement(v1Prefix, "id", v1Ns);
idElement.InnerText = id.ToString();
merc.AppendChild(idElement);
var regKeyElement = xmlDoc.CreateElement(v1Prefix, "regKey", v1Ns);
regKeyElement.InnerText = regKey;
merc.AppendChild(regKeyElement);
var inTypeElement = xmlDoc.CreateElement(v1Prefix, "inType", v1Ns);
inTypeElement.InnerText = inType.ToString();
merc.AppendChild(inTypeElement);
var prodTypeElement = xmlDoc.CreateElement(v1Prefix, "prodType", v1Ns);
prodTypeElement.InnerText = prodType.ToString();
merc.AppendChild(prodTypeElement);
var tranCodeElement = xmlDoc.CreateElement(v1Prefix, "tranCode", v1Ns);
tranCodeElement.InnerText = tranCode.ToString();
sendTranRequest.AppendChild(tranCodeElement);
这会产生与上面相同的 XML。
使用
XmlDocument
时要构造您的 XML 请求,有两个 XmlDocument.Save
您可以用于您的目的的功能。一个接受 Stream
另一个接受 XmlWriter
.如果您可以省略空格,请使用接受 XmlWriter
的重载。并将其添加到 HttpWebRequest
将是:using (var requestStream = httpRequest.GetRequestStream())
using (var writer = XmlWriter.Create(requestStream, xmlWriterSettings))
{
xmlDoc.Save(writer);
}
如果您需要包含空格,请使用:
using (var requestStream = httpRequest.GetRequestStream())
{
xmlDoc.Save(requestStream);
}
关于c# - 在 .NET Web 应用程序中实现 XML 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15937318/