|
分類:[VB.NET/VB2005 以降]
お世話になります。始めて投稿します。
自社システム開発で行き詰まり、皆さんのお力を拝借したいと存じます。
開発環境 Windows7(32bit) Visual Basic 2015 professional
弊社のとある取引先サイトのリンクからpdfファイルを取り出し、指定のフォルダに保存する一連の プログラムを組んでいます。
Dim sZumenURL As String = vbNullString Dim returnValue as String = vbNullString
'発注情報画面(この画面には、工事図面というリンク文字列は1つのみ。必ず存在する) Dim doc As HtmlDocument = WebBrowser1.Document ' リンク文字列とそのURLの列挙 For Each ele As HtmlElement In doc.GetElementsByTagName("A") Dim href As String = ele.GetAttribute("HREF") ' HREF属性の値 Dim text As String = ele.InnerText ' リンク文字列 If (Not String.IsNullOrEmpty(href)) And (Not String.IsNullOrEmpty(text)) Then text = text.Replace(vbCrLf, "") ' 改行文字の削除 Select Case text Case "工事図面" sZumenURL = href 'hogehoge.pdfのURL End Select End If Next
'hogehoge.pdfをWebBrowserに表示する WebBrowser1.Navigate(sZumenURL) '←※一旦WebBrowserに表示しないと、何故かURLDownloadToFileでhogehoge.pdfが正常に取得できず。※
'工事図面が表示されるまで待つ。 Do While WebBrowser1.IsBusy Or WebBrowser1.ReadyState <> 4 Application.DoEvents() System.Threading.Thread.Sleep(100) Loop 'URLDownloadToFile API をコールする hogehoge.pdf を zumen.pdfに変更して保存 returnValue = URLDownloadToFile(0, sZumenURL, "C:\temp\zumen.pdf", 0, 0) '・・・今後問題となる部分
If returnValue = 0 Then '正常処理 Else '図面取り出しエラー End If
といったロジックを組みました。実はこのロジックは
Windows XP VB6.0(SP5)
で開発したものをVB2015ベースで作り直している最中のものです。
XPのシステムは今でも現役で活躍してもらっていますが、いい加減XPは卒業しないといけませんのでVB2015でWin7〜10向けに 開発しています。
さて、こちらのロジックを走らせた時、URLDownloadToFileで以下のエラーが発生しました。
============================================================================================ 「請求は中止されました:SSL/TLSのセキュリティで保護されているチャネルを作成できませんでした」 ============================================================================================
と出てきました。ここから私も調査し、色々と試しました。まずは
Net.ServicePointManager.SecurityProtocol = Net.SecurityProtocolType.Tls Or Net.SecurityProtocolType.Tls11 Or Net.SecurityProtocolType.Tls12
をURLDownloadToFileの前に宣言してみたものの、同じエラーメッセージが出て改善せず。
次に、URLDownloadToFileの部分を
Try My.Computer.Network.DownloadFile(sZumenURL, "C:\temp\zumen.pdf", "", "", False, 60000, True, FileIO.UICancelOption.DoNothing) Catch ex As Exception MessageBox.Show(ex.Message) End Try
としたり、
Dim wc As New System.Net.WebClient() Try wc.DownloadFile(sZumenURL, "C:\temp\zumen.pdf") Catch ex As Exception MessageBox.Show(ex.Message) Finally wc.Dispose() End Try
と入れ替えても改善されず。
開発環境に問題があるのだろうかと思い、更に環境を変えてやってみました。
・Windows7(32bit) .NET Frameworkを4.5.2 → 4.6.1に変更 ・Windows10(64bit) VB2015 professional .NET Framework 4.6.1 ・Windows10(64bit) VB2019 preview .NET Framework 4.7
マシンを変え、OSを変え、VSを変えて色々試しましたが、結果は同じエラーメッセージが出ました。
どうしようもなくなった為、今度は視点を変えてキャッシュから直接hogehoge.pdfを取り出そうと試みました。
Try Dim SystemPath As String = System.Environment.GetFolderPath(Environment.SpecialFolder.InternetCache) FileCopy(SystemPath & "\hogehoge.PDF", "C:\temp\zumen.pdf") Catch ex As Exception MessageBox.Show(ex.Message) End Try
動作確認のためソースを簡略化していますが、結果が
============================================================================================ ファイル 'C:\Users\・・・・・\Temporary Internet Files\hogehoge.pdf'が見つかりませんでした。 ============================================================================================
となってしまい、キャッシュからの取得も出来ませんでした。 ※直接Temporary Internet Filesを見に行けば、hogehoge.pdfが残っている事は確認済です。
Windwos Vista 以降、「保護されたオペレーティングシステム ファイル」になったとか何かで、 フォルダオプションの設定を見える様変更すれば…という問題でも無く。。。
このままだとVB経由でキャッシュの中身を取りに行くことも出来ないのか…となり、行き詰って現在に至ります。
それを踏まえ、
Q1 WebBrowserにpdfを表示まではうまくいくので、WebBrowserにてpdfを特定のフォルダへ保存や、印刷する 機能って…無いですか?
Q2 「SSL/TLSのセキュリティで…」のエラー回避の方法は何かご存知ありませんでしょうか。
Q3 システムファイルから、特定のファイル(hogehoge.pdf)を抽出できる特殊な関数はありますか?
最終的にはWeb上のpdfを指定のフォルダに保存出来れば充分なのですが、何か良い手段は無いでしょうか。
【補足】 ここまでの流れと調査で、一番最初に出た「SSL/TLSのセキュリティで…」と、Temporary Internet Files内の ファイルを取得できない事は、今回の事象として無関係では無いのでは?とも思っています。
XPの時代から、一度WebBrowserにpdfファイルを表示してからURLDownloadToFileを実行しないと、pdfファイル の中身は白い空のファイルで、正常に取得が出来ませんでした。
その時、URLDownloadToFileは実はキャッシュから取り出しているのか?と疑いながらも、問題なく動作するので 詳しく解析はしませんでした。
そこで今までの調査で最後に、
Windwos7(32bit) VB6.0(SP6)
を使って、XPの時のソースで動作確認しましたところ、WebBrowserにhogehoge.pdfを表示後、URLDownloadToFile で「SSL/TLSのセキュリティで…」のエラーは発生しませんでした。
しかし、保存先のC:\temp\zumen.pdfの中身を確認しましたところ、ファイルの中身は白い空ファイルでした。
Temporary Internet Filesからのファイルを取得できないから?と疑っています。
長文失礼しました。何卒ご助力の程、よろしくお願い致します。
|