从数据库中提取 XML 文件,然后将其上传到服务器的工具的最佳设计
Best design for a tool to extract an XML file from a database, to then upload it to a server
我正在创建一个工具(C# Windows 表单)来集成不同系统之间的数据。
该工具触发生成 XML 文件(由 PL/SQL 在 Oracle 数据库上生成)。然后将其存储在数据库 table 的 XMLType 字段中。然后我想从数据库中提取这个文件并将其上传到服务器。
XML 文件的大小可能高达 50MB,并且可能包含敏感的个人数据。
该工具应用程序将 运行 在远离数据库服务器和目标(上传)服务器的主机上。它将允许用户选择不同类型的 XML 数据来生成,以及不同的目标服务器来上传。
理论上也可以将文件直接从数据库服务器直接上传到目的地。因此,我可以创建工具来简单地协调它,而无需将文件传输到 运行 使用该工具的主机。话虽如此,我想我仍然必须在上传文件之前将文件写入数据库服务器的文件系统。这只是将文件写出从主机运行正在使用该工具的数据库服务器文件系统。
简而言之:文件X是由数据库服务器A生成的,需要传输到服务器B进行处理。该工具将协调 X 的生成和文件传输,从 A 到 B。
因此,该工具将:
- 通过存储数据库过程触发 Oracle 数据库进程生成一些 XML。 (此 XML 生成过程已在 Oracle 上运行)
- 从 Oracle 存放的数据库 table 中提取新生成的 XML。
- 将此 XML 文件(使用 HTTPS)传输到另一台服务器,随后将在该服务器上进行处理。
提取 XML 并将其转储到本地计算机上的临时文件 运行 是否更好,然后上传此本地文件,或者可以一次完成提取和上传:将 XML 输出从数据库服务器直接传输到其目的地 - 从而节省了对 "middle man"?
上的临时文件的需要
促进这一点的最佳方法是什么,为什么?可以在不需要临时 XML 文件的情况下完成吗?
你可以一次搞定-
- 从 C#
生成 XML
- 将生成的XML数据存储在一个字符串变量中(strXMLData)
将字符串内容写入文件(.xml)
System.IO.File.WriteAllText (@"D:\New Folder\yourfile.xml", strXML数据);
我不知道回答你自己的问题是否很酷,但是就这样吧!
解决方案归结为我创建的 class。它在其构造函数中保存从 Oracle 检索的 XML 提要,并允许上传它。也许有人会欣赏这个例子。
using System;
using System.IO;
using System.Net;
using System.Text;
namespace SelfGeneratedFeedData
{
internal class DataFeed
{
private OracleAccess oa;
public string FeedContainer { get; private set; }
public string Filename { get; private set; }
public int Seqno { get; private set; }
public DataFeed(OracleAccess oa, string fn, int sn)
{
this.oa = oa;
this.Seqno = sn;
this.Filename = fn;
this.FeedContainer = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(oa.getXmlFeed(fn, sn)));
}
public BBServerResponse UploadFeed(Uri uri, string un, string pw)
{
BBServerResponse resp = new BBServerResponse("Error", HttpStatusCode.InternalServerError);
if (!String.IsNullOrEmpty(this.FeedContainer)
&& !String.IsNullOrEmpty(un))
{
try
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
req.Method = "POST";
req.ContentType = "text/xml";
// Using HTTP v1.0 seems to be important for my server.
req.ProtocolVersion = HttpVersion.Version10;
req.KeepAlive = true;
req.Credentials = new NetworkCredential(un, pw);
using (var sw = new StreamWriter(req.GetRequestStream()))
{
sw.Write(FeedContainer);
}
using (var response = req.GetResponse())
{
Console.WriteLine(((HttpWebResponse)response).StatusDescription);
using (var sr = new StreamReader(response.GetResponseStream()))
{
resp = new BBServerResponse(sr.ReadToEnd(), ((HttpWebResponse)response).StatusCode);
}
if (((HttpWebResponse)response).StatusCode == HttpStatusCode.OK)
oa.addTimeStamp(Filename, Seqno);
}
//Tidy up
req.Abort();
}
catch (Exception ex)
{
resp = new BBServerResponse(ex.Message.ToString(), HttpStatusCode.InternalServerError);
}
}
return resp;
}
}
}
我正在创建一个工具(C# Windows 表单)来集成不同系统之间的数据。
该工具触发生成 XML 文件(由 PL/SQL 在 Oracle 数据库上生成)。然后将其存储在数据库 table 的 XMLType 字段中。然后我想从数据库中提取这个文件并将其上传到服务器。
XML 文件的大小可能高达 50MB,并且可能包含敏感的个人数据。
该工具应用程序将 运行 在远离数据库服务器和目标(上传)服务器的主机上。它将允许用户选择不同类型的 XML 数据来生成,以及不同的目标服务器来上传。
理论上也可以将文件直接从数据库服务器直接上传到目的地。因此,我可以创建工具来简单地协调它,而无需将文件传输到 运行 使用该工具的主机。话虽如此,我想我仍然必须在上传文件之前将文件写入数据库服务器的文件系统。这只是将文件写出从主机运行正在使用该工具的数据库服务器文件系统。
简而言之:文件X是由数据库服务器A生成的,需要传输到服务器B进行处理。该工具将协调 X 的生成和文件传输,从 A 到 B。
因此,该工具将:
- 通过存储数据库过程触发 Oracle 数据库进程生成一些 XML。 (此 XML 生成过程已在 Oracle 上运行)
- 从 Oracle 存放的数据库 table 中提取新生成的 XML。
- 将此 XML 文件(使用 HTTPS)传输到另一台服务器,随后将在该服务器上进行处理。
提取 XML 并将其转储到本地计算机上的临时文件 运行 是否更好,然后上传此本地文件,或者可以一次完成提取和上传:将 XML 输出从数据库服务器直接传输到其目的地 - 从而节省了对 "middle man"?
上的临时文件的需要促进这一点的最佳方法是什么,为什么?可以在不需要临时 XML 文件的情况下完成吗?
你可以一次搞定-
- 从 C# 生成 XML
- 将生成的XML数据存储在一个字符串变量中(strXMLData)
将字符串内容写入文件(.xml)
System.IO.File.WriteAllText (@"D:\New Folder\yourfile.xml", strXML数据);
我不知道回答你自己的问题是否很酷,但是就这样吧!
解决方案归结为我创建的 class。它在其构造函数中保存从 Oracle 检索的 XML 提要,并允许上传它。也许有人会欣赏这个例子。
using System;
using System.IO;
using System.Net;
using System.Text;
namespace SelfGeneratedFeedData
{
internal class DataFeed
{
private OracleAccess oa;
public string FeedContainer { get; private set; }
public string Filename { get; private set; }
public int Seqno { get; private set; }
public DataFeed(OracleAccess oa, string fn, int sn)
{
this.oa = oa;
this.Seqno = sn;
this.Filename = fn;
this.FeedContainer = Encoding.UTF8.GetString(Encoding.UTF8.GetBytes(oa.getXmlFeed(fn, sn)));
}
public BBServerResponse UploadFeed(Uri uri, string un, string pw)
{
BBServerResponse resp = new BBServerResponse("Error", HttpStatusCode.InternalServerError);
if (!String.IsNullOrEmpty(this.FeedContainer)
&& !String.IsNullOrEmpty(un))
{
try
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uri);
req.Method = "POST";
req.ContentType = "text/xml";
// Using HTTP v1.0 seems to be important for my server.
req.ProtocolVersion = HttpVersion.Version10;
req.KeepAlive = true;
req.Credentials = new NetworkCredential(un, pw);
using (var sw = new StreamWriter(req.GetRequestStream()))
{
sw.Write(FeedContainer);
}
using (var response = req.GetResponse())
{
Console.WriteLine(((HttpWebResponse)response).StatusDescription);
using (var sr = new StreamReader(response.GetResponseStream()))
{
resp = new BBServerResponse(sr.ReadToEnd(), ((HttpWebResponse)response).StatusCode);
}
if (((HttpWebResponse)response).StatusCode == HttpStatusCode.OK)
oa.addTimeStamp(Filename, Seqno);
}
//Tidy up
req.Abort();
}
catch (Exception ex)
{
resp = new BBServerResponse(ex.Message.ToString(), HttpStatusCode.InternalServerError);
}
}
return resp;
}
}
}