none
WEB上のデータを取得しようとすると「初回例外」が起きるのはどうしてでしょうか。 RRS feed

  • 質問

  • Microsoft Visual Basic 2008
    Visual Studio2008
    Windows7

    WEB上からデータを取得しようと、HttpWebRequest及びHttpWebResponseを使用しているのですが
    「System.Net.WebException' の初回例外が System.dll で発生しました。」というエラーが発生してしまいます。

    以下のプログラムのどこがおかしいのでしょうか?
    ご教授頂けます様お願いします。

       Private Sub btnDownload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDownload.Click
    
            Dim request As HttpWebRequest
            Dim requestObject As New RequestObject()
            Dim asyncResult As IAsyncResult
            Dim item As RegisteredItem
            Dim downloadFile As String
            Dim downloadTo As String
            Dim result As MsgBoxResult
            Dim msg As String
    
            If lbDownloadList.Items.Count = 0 Then
                Exit Sub
            End If
    
            item = CType(lbDownloadList.Items(0), RegisteredItem)
            downloadFile = item.DownloadFile
            downloadTo = item.DownloadTo
    
            If File.Exists(downloadTo) Then
                result = MsgBox("すでにファイルが存在します。" & "上書きしますか?", MsgBoxStyle.YesNoCancel Or MsgBoxStyle.Information, "確認")
    
                If result = MsgBoxResult.Yes Then
                    File.Delete(downloadTo)
                Else
                    Exit Sub
                End If
            End If
    
            Abort = False
            Downloading = True
            btnDownload.Enabled = False
    
            'GetFileSize(downloadFile)
            'msg=lbDownloadList.Item(0).ToString
            'Invoke(UpdateLabelItemDelegate,New Object(){msg,LabelTarget.FileName})
            'msg="ダウンロード開始..."
            'Invoke(UpdateLavelItemDelegate,New Object()){msg,LavelTargetStatus})
            request = HttpWebRequest.Create(downloadFile)
            requestObject.DownloadTo = downloadTo
            requestObject.Request = CType(request, HttpWebRequest)
            asyncResult = requestObject.Request.BeginGetResponse(AddressOf DownloadRequestCallBack, requestObject)
    
        End Sub
        Private Sub DownloadRequestCallBack(ByVal result As IAsyncResult)
    
            Dim requestObject As RequestObject
            Dim request As HttpWebRequest
            Dim response As HttpWebResponse
            Dim fs As FileStream
            Dim stream As Stream
            Dim buffer As Byte()
            Dim count As Integer
            Dim total As Integer
            Dim msg As String
            Dim err As HttpWebResponse
    
            requestObject = CType(result.AsyncState, RequestObject)
            request = requestObject.Request
    
            Try
                response = CType(request.EndGetResponse(result), HttpWebResponse)
                stream = response.GetResponseStream()
            Catch ex As WebException
                err = CType(ex.Response, HttpWebResponse)
                'msg = String.Format("Error {0} : {1},Clng(err.StatusCode),err.StatusDescription)
                'Invoke(UpdateLavelItemDelegate,New Object() {msg,LavelTarget.Status})
                Exit Sub
            End Try
    
            fs = New FileStream(requestObject.DownloadTo, FileMode.CreateNew)
            buffer = New Byte(1024) {}
    
            count = 0
            total = 0
    
            Do
                count = stream.Read(buffer, 0, buffer.Length)
                total += count
                'msg= String.Format("ダウンロード済み: {0:#,##0} バイト",total)
                'Invoke(UpdateLavelItemDelegate,New Object() {msg,LavelTarget.Status})
                fs.Write(buffer, 0, count)
    
                If Abort Then
                    'msg "ダウンロードキャンセル"
                    'Invoke(UPdateLavelItemDelegate,New Object() {msg,LavelTarget.Status})
                    stream.Close()
                    fs.Close()
                    response.Close()
                    Exit Sub
                End If
            Loop While count <> 0
    
            stream.Close()
            fs.Close()
            response.Close()
            Invoke(RemoveListItemDelegate)
            Abort = False
    
            Downloading = False
    
            'msg="ダウンロード終了"
    
            'Invoke(UpdateLavelItemDelegate,New Object() {msg,LavelTarget.Status})
            btnDownload_Click(Nothing, Nothing)
    
        End Sub
    2010年1月13日 9:57

回答

  • 初音玲様、totojo様

    返答遅くなり申し訳ありません。

    ご回答ありがとうございました。どの方面で調べていくのかが分かっただけでもとてもありがたいです。
    まずは初音玲様が教えて下さったサンプルの確認から進めて行きたいと思います。
    その後の調べ方も教えて頂き、本当にありがとうございました。

    長くなりましたのでこの質問はここで終わらせて頂きます。
    • 回答としてマーク chromeMAO 2010年1月14日 23:29
    2010年1月14日 23:29

すべての返信

  • WEB上からデータを取得しようと、HttpWebRequest及びHttpWebResponseを使用しているのですが
    「System.Net.WebException' の初回例外が System.dll で発生しました。」というエラーが発生してしまいます。

    どの行でエラーが発生していますか?


    http://blogs.wankuma.com/hatsune/
    2010年1月13日 10:20
  • ついでに具体的な例外メッセージも。
    2010年1月13日 10:22
  • 返信が遅くなり申し訳ありません。
    デバックを実行すると、イミディエイトウィンドウに「'System.Net.WebException' の初回例外が System.dll で発生しました。」と表示され、処理が止まってしまっています。

    他のエラーの時はどの行でエラーが発生しているか、詳細情報がポップアップされたので分かったのですが今回はイミディエイトウィンドウに表示されるだけなので
    どこでこけてるのかが分かりません。
    一つ一つブレイクポイントを置いていくしかないのでしょうか?
    2010年1月14日 4:09
  • ステップ実行はできませんか?
    コールバックの中も、入り口でブレークポイントを置いてステップ実行してみるとか。
    2010年1月14日 4:35
  • ステップインを実行してみました。

    btnDownload_Clickの一番最後、
    asyncResult = requestObject.Request.BeginGetResponse(AddressOf DownloadRequestCallBack, requestObject)
    
        End Sub
    ここを抜けた途端「'System.Net.WebException' の初回例外が System.dll で発生しました。」がイミディエイトウィンドウに表示されました。

    ということは、コールバックをちゃんと呼べていないという事になるのでしょうか?
    2010年1月14日 4:54
  • 現象からすると、コールバックの中で例外が出ているのではないかと思います。
    コールバック内にある Catch の中にブレークポイントを置くと、ヒットしませんか?

    例外を Catch しているので(例外を捨ててますね、もったいない。)、例外アシスタントは出ないかも。
    2010年1月14日 6:01
  • totojoさん、一つ一つ教えていただき感謝します。

    例外、発見する事が出来ました。
    以下例外アシスタントの内容copyです。

    System.Net.WebException がキャッチされました
      Message="リモート サーバーがエラーを返しました: (404) 見つかりません"
      Source="System"
      StackTrace:
           場所 System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
           場所 Download_Application.Form1.DownloadRequestCallBack(IAsyncResult result) 場所 C:\Users\UserName\Documents\Visual Studio 2008\Projects\Download_Application\Download_Application\Form1.vb:行 162
      InnerException:

    しかし原因が分かっても解決方法がまだ分からないのでこれから調べます・・・
    2010年1月14日 6:21
  • HTTP 404 なので、URL 辺りが...
    2010年1月14日 7:32
  • うーん、分からない…でも、URLではないと思います。全く同じアドレスをブラウザ直打ちだとダウンロードされるので。

    実はこれは日経BPの「最新ゼロから学ぶVisualBasic」の中の1プログラムで、サンプルプログラムも下記から入手できます。
    http://itpro.nikkeibp.co.jp/article/MAG/20081113/319258/
    こちらの「初級編 その1 複数のファイルを一度に取得するダウンローダを作成する」で、すでに躓いているのです・・・

    自分のプログラムと、サンプルプログラムを比較してみようと思いサンプルプログラムをダウンロードしましたが、
    サンプルプログラムも同じエラーが出るのです。

    リモート サーバーがエラーを返しました: (404) 見つかりません
    System.Net.WebException がキャッチされました
      Message="リモート サーバーがエラーを返しました: (404) 見つかりません"
      Source="System"

    調べてみてはいるのですが、さっぱり分かりませんお手上げ状態です。
    どなたかお分かりになりませんでしょうか・・・

    2010年1月14日 7:58
  • ブラウザーの方はプロキシ経由だったりしませんか?
    2010年1月14日 8:07
  • うーん、分からない…でも、URLではないと思います。全く同じアドレスをブラウザ直打ちだとダウンロードされるので。

    非同期でのファイル受信とかゼロからということであれば初級編とは言えないですね。
    まずは、
    の「WebRequest、WebResponseクラスを使ってファイルをダウンロードし表示する」で非同期とは切り離したサンプルで確認されては?
    totojoさんも書かれているようにプロキシが絡んでいるのであれば↑でも同じエラーがでるはず。
    で、同じエラーがでたら、WebRequestとかのProxy指定についてMSDNとかで調べてみて下さい。


    http://blogs.wankuma.com/hatsune/
    2010年1月14日 9:55
  • 初音玲様、totojo様

    返答遅くなり申し訳ありません。

    ご回答ありがとうございました。どの方面で調べていくのかが分かっただけでもとてもありがたいです。
    まずは初音玲様が教えて下さったサンプルの確認から進めて行きたいと思います。
    その後の調べ方も教えて頂き、本当にありがとうございました。

    長くなりましたのでこの質問はここで終わらせて頂きます。
    • 回答としてマーク chromeMAO 2010年1月14日 23:29
    2010年1月14日 23:29