我需要从安全链接下载xml文件,并将内容存储到数据库中。
我可以使用文字阅读器???或者我需要先将文件存储到我的本地文件系统中,然后从我的文件系统中读取内容并存储到我的数据库中?
HttpWebRequest downloadRequest = (HttpWebRequest)WebRequest.Create("https://line-to-xml-file.xml");
string Content;
downloadRequest.Credentials = new NetworkCredential()
{
UserName = this._userCredentials.UserName,
Password = this._userCredentials.Password
};
downloadRequest.PreAuthenticate = true;
using (HttpWebResponse downloadHTTPResponse = (HttpWebResponse)downloadRequest.GetResponse())
{
using (Stream downloadResponseStream = downloadHTTPResponse.GetResponseStream())
using (TextReader tReader = new StreamReader(downloadResponseStream))
{
Content = tReader.ReadToEnd();
}
}
return Content;
由于远程文件很大,高达100MB,我无法从调试中看到任何内容。 当我试图保存它时。
using (TransactionScope trans = new TransactionScope()) <--- when comes to this line, exception throws...
{
// perform update, save the content into databse
// send a notification message to message bus, indicate content has been updated
}
抱怨MSDTC交易超时/取消
答案 0 :(得分:1)
通过将其放入流中,您应该没问题...如果您对该特定流有任何问题,那么您可以使用MemoryStream而不是FileStream并以相同的方式使用它。但我几乎不怀疑这是你的情况。
我认为你应该确保在你要保存流之前以及完全加载它之前打开连接......你也可以使用你的Command.TimeOut属性,真的很长时间保存,这里“值为0表示没有限制”,但这应该避免。 但是
答案 1 :(得分:0)
有一个XmlReader,但是如果Xml已经格式正确并且您不需要解析它,因为您的数据库只是将其作为一个blob,或者数据库引擎将要解析它,你可以使用任何东西。
取决于您的数据库架构。
听起来数据库在插入时遇到问题,但需要更多信息。
答案 2 :(得分:0)
如何使用WebClient及其下载文件方法。只需将其保存在本地,使用它并在完成使用后删除。
答案 3 :(得分:0)
100MB的文字在桌子上塞满了很多东西。你的陈述几乎肯定是超时的。检查您的上下文和SQL命令对象(如果有的话)并增加超时值。
答案 4 :(得分:0)
您可能会设置更长的超时持续时间来解决超时问题,并确保调用完成功能
using (TransactionScope trans = new TransactionScope(
TransactionScopeOption.Required, new TimeSpan(1, 4, 3))) // Sets time out to 1 hour 4 minutes and 3 seconds
{
// perform update, save the content into databse
// send a notification message to message bus, indicate content has been updated
trans.Complete();
}
对于读取文件,您可以使用WebClient。 WebClient允许您监控进度。
WebClient wc = new WebClient();
wc.Credentials = new NetworkCredential()
{
UserName = this._userCredentials.UserName,
Password = this._userCredentials.Password
};
wc.DownloadProgressChanged += new DownloadProgressChangedEventHandler(wc_DownloadProgressChanged);
wc.DownloadFile("https://line-to-xml-file.xml", "C:\\local.xml");
如有必要,处理程序可以记录进度:
void wc_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
// Log or show the current progress (e.ProgressPercentage or e.BytesReceived)
}
如果您希望字符串笔直而无需再次读取文件,则可以使用DownloadString而不是Download file。
wc.DownloadString("https://line-to-xml-file.xml");