Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# 在.NETWeb应用程序中实现XML请求_C#_.net_Xml_Service_Web - Fatal编程技术网

C# 在.NETWeb应用程序中实现XML请求

C# 在.NETWeb应用程序中实现XML请求,c#,.net,xml,service,web,C#,.net,Xml,Service,Web,我一直在读啊读,但是我越读越糊涂。我正在用C#构建一个ASP.NET 4.0 web应用程序。我正在尝试实现信用卡处理。我使用的公司提供了一个示例XML SOAP请求和响应,但我不确定该怎么办。我是一个新手开发人员,对所有这些都是新手。我只是不知道从哪里开始。非常感谢您的帮助,我还必须通过SSL发送,但这可能是一个完全不同的问题 这是SOAP请求 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelop

我一直在读啊读,但是我越读越糊涂。我正在用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>

我建议看一下课程和课程。
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);
}
至于通过SSL/TLS处理事务,你很幸运,.NET会为你解决这个问题,你只需要在提供给
HttpWebRequest.Create的URL中指定
https
over
http


构造XML的方法有很多种,一种是在名称空间中使用、和对象。除非您不能使用至少.NET3.5,否则我建议您使用。由于您是在APS.NET 4.0中创建应用程序,因此这不应该是一个问题

创建
XElement
并需要指定名称空间时,首先需要创建
XNamespace
对象

var ns = XNamespace.Get("http://tempuri.com");
var root = new XElement(ns + "Root", "Body");
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:

<Root xmlns="http://tempuri.com">Body</Root>
<prefix:Root xmlns:prefix="http://tempuri.com">Body</prefix:Root>
<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:

<Root xmlns="http://tempuri.com">Body</Root>
<prefix:Root xmlns:prefix="http://tempuri.com">Body</prefix:Root>
<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:

<Root xmlns="http://tempuri.com">Body</Root>
<prefix:Root xmlns:prefix="http://tempuri.com">Body</prefix:Root>
<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>
这里需要注意的一点是with的创建,这允许您在XML元素之间不包含任何空格。如果需要空白,只需调用
XmlWriter.create(stream)


如果无法使用.NET 3.5或更高版本,则可以使用命名空间中的和对象

出于您的目的,使用
XmlDocument
xmlement
构建所需的XML将很容易,但它需要更多的代码。要创建
xmlement
,您需要
XmlDocument
来创建对象。该函数有一个重载,允许您同时指定名称空间前缀和名称空间,这样就更直接了

使用
XmlDocument
xmlement
需要注意的一点是,在构建了
xmlement
之后,需要手动将其附加到适当的对象。另一件事是,您也不能在构造过程中指定
xmlement
的主体,因此这也需要在创建之后完成

以这种方式构造XML的操作顺序无关紧要。它主要是确保将
xmlement
附加到正确的父对象,并在右侧
xmlement
对象上设置
InnerText

var ns = XNamespace.Get("http://tempuri.com");
var root = new XElement(ns + "Root", "Body");
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请求时,有两个函数可供使用。一个接受
,另一个接受
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);
}

我建议看一下课程和课程。
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);
}
至于通过SSL/TLS处理事务,你很幸运,.NET会为你解决这个问题,你只需要在提供给
HttpWebRequest.Create的URL中指定
https
over
http


构造XML的方法有很多种,一种是在名称空间中使用、和对象。除非您不能使用至少.NET3.5,否则我建议您使用。由于您是在APS.NET 4.0中创建应用程序,因此这不应该是一个问题

创建
XElement
并需要指定名称空间时,首先需要创建
XNamespace
对象

var ns = XNamespace.Get("http://tempuri.com");
var root = new XElement(ns + "Root", "Body");
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:

<Root xmlns="http://tempuri.com">Body</Root>
<prefix:Root xmlns:prefix="http://tempuri.com">Body</prefix:Root>
<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:

<Root xmlns="http://tempuri.com">Body</Root>
<prefix:Root xmlns:prefix="http://tempuri.com">Body</prefix:Root>
<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:

<Root xmlns="http://tempuri.com">Body</Root>
<prefix:Root xmlns:prefix="http://tempuri.com">Body</prefix:Root>
<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>
这里需要注意的一点是with的创建,这允许您在XML元素之间不包含任何空格。如果需要空白,只需调用
XmlWriter.create(stream)


如果无法使用.NET 3.5或更高版本,则可以使用命名空间中的和对象

出于您的目的,使用
XmlDocument
xmlement
构建所需的XML将很容易,但它需要更多的代码。要创建
xmlement
,您需要
XmlDocument
来创建对象。该函数有一个重载,允许您同时指定名称空间前缀和名称空间,这样就更直接了

使用
XmlDocument
xmlement
需要注意的一点是,您需要手动将
xmlement
附加到相应的对象