c# - 在 .NET Web 应用程序中实现 XML 请求

标签 c# .net 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>

这是我的创建请求和读取响应
 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/

相关文章:

c# - 如何将图像存储在磁盘上并使用 EF 链接到数据库?

c# - 个人用户的 Azure Active Directory 组成员身份检查

c# - 非重放热可观察

regex - 如何在 Ant 中使用正则表达式替换 xml 标签之间的值?

python - 解析除某些属性值之外的 float 和返回路径

c# - ASP.NET vNext 和 Ninject 在两个服务的构造函数之间检测到循环依赖

c# - 如何生成具有 Name 属性而不是 Id 的链接

c# - 使用 DllImport 从 C# 调用 Win API 的访问冲突

.net - 如何正确复制/克隆结构?我应该改用类(class)吗?

xml - Xpath/XSLT : How to select attribute of element which has not child with name. ..?