use*_*003 1 .net c# xml service web
我一直在阅读和阅读,但我越往前走越困惑.我正在用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>
Run Code Online (Sandbox Code Playgroud)
这是我的创建请求和读取响应
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();
Run Code Online (Sandbox Code Playgroud)
我建议看看HttpWebRequest
和HttpWebResponse
课程.该HttpWebRequest
课程将让你定身,头,凭证和其他东西发出请求.而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);
}
Run Code Online (Sandbox Code Playgroud)
至于处理做的东西通过SSL/TLS有你很幸运,.NET会照顾的,对你,你只需要指定https
了http
在您提供的网址HttpWebRequest.Create
.
有一些你构建你的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");
Run Code Online (Sandbox Code Playgroud)
这将产生以下XML:
<Root xmlns="http://tempuri.com">Body</Root>
Run Code Online (Sandbox Code Playgroud)
但是,您需要能够指定名称空间前缀.为了做到这一点,你需要先添加一个XAttribute
对象,然后XElement
首先使用前缀,并通过构造函数指定前缀.
var ns = XNamespace.Get("http://tempuri.com");
var root = new XElement(ns + "Root",
new XAttribute(XNamespace.Xmlns + "prefix", ns)
"Body"
);
Run Code Online (Sandbox Code Playgroud)
这将产生以下XML:
<prefix:Root xmlns:prefix="http://tempuri.com">Body</prefix:Root>
Run Code Online (Sandbox Code Playgroud)
以下是使用这些对象构建的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)
)
)
);
Run Code Online (Sandbox Code Playgroud)
这导致以下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>
Run Code Online (Sandbox Code Playgroud)
要将XML包含在HttpWebRequest
do 的主体中:
var xmlWriterSettings = new XmlWriterSettings
{
NewLineHandling = NewLineHandling.None
};
using (var requestStream = httpRequest.GetRequestStream())
using (var writer = XmlWriter.Create(requestStream, xmlWriterSettings))
{
xml.WriteTo(writer);
}
Run Code Online (Sandbox Code Playgroud)
这里值得注意的一两件事是的创作XmlWriter
与XmlWriterSettings
,这可以让你不包括XML元素之间的任何空白.如果你需要空格,你可以XmlWriter
通过调用来创建XmlWriter.Create(stream)
如果无法使用.NET 3.5或更高版本,则可以使用命名空间中的XmlDocument
和XmlElement
对象System.Xml
.
为了您的目的,构建所需的XML将很容易与XmlDocument
和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);
Run Code Online (Sandbox Code Playgroud)
这导致与上面相同的XML.
使用XmlDocument
构造XML请求时,XmlDocument.Save
可以使用两个函数来实现.一个接受Stream
另一个接受a XmlWriter
.如果你可以省略空格,请使用接受a的重载XmlWriter
并将其添加到HttpWebRequest
:
using (var requestStream = httpRequest.GetRequestStream())
using (var writer = XmlWriter.Create(requestStream, xmlWriterSettings))
{
xmlDoc.Save(writer);
}
Run Code Online (Sandbox Code Playgroud)
如果您需要包含空格使用:
using (var requestStream = httpRequest.GetRequestStream())
{
xmlDoc.Save(requestStream);
}
Run Code Online (Sandbox Code Playgroud)