如何处理下载流

时间:2011-03-02 03:42:05

标签: c# https stream msdtc

我需要从安全链接下载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交易超时/取消

5 个答案:

答案 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");