- PR -

ファイル送信時のエラー情報を知りたい(My.Computer.Network.UploadFile)

1
投稿者投稿内容
未記入
会議室デビュー日: 2007/09/26
投稿数: 3
投稿日時: 2007-09-26 20:17
平素よりお世話になっております。
どこから手をつけていいのか、はたまたこんな事が実現できるのか
全く分からないので、どなたかご教授頂けませんでしょうか。

 ある端末(端末Aとします)から違う端末(端末Bとします)へ
 ファイルを送信したいと思っています。
 (ある事情があり、ネットワークドライブの作成は出来ません)

 そこで、[My.Computer.Network.UploadFile]命令を見つけ、
 以下のような構成/PGを考えました。

 ■Windowsアプリケーション----------------------------------------------------
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Try
      '作成したWebアプリケーションへローカルファイル「C:\temp\なんちゃら.txt」を送信する
      My.Computer.Network.UploadFile("C:\temp\なんちゃら.txt", _
                      "http://(Webアプリケーション仮想ディレクトリ)/Default.aspx")
    Catch ex As Exception
      '#####################################
      'なんらかのエラーがあったらキャッチ
      '#####################################
    End Try

  End Sub
 -----------------------------------------------------------------------------

 ■Webアプリケーション(Default.aspx)------------------------------------------
  Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

      '送信ファイルを取得する
      Dim upFiles As HttpFileCollection = Request.Files

      '送信ファイルが存在しなかったらエラーを発生させる
      If upFiles.Count <= 0 Then Throw New Exception("送信ファイルがありません。")

      For i As Integer = 0 To upFiles.Count - 1
       Try
         '・・・ファイルの処理・・・
       Catch ex As Exception
         'エラーを返す
         Throw ex
      Next i
    End Sub
 -----------------------------------------------------------------------------

 正常処理の場合はうまく行きました。ところが!。
 Webアプリケーション側で発生させたエラーメッセージを
 Windowsアプリケーション側でキャッチ(#で囲んでいる部分)すると、
 「リモート サーバーがエラーを返しました: (500) 内部サーバー エラーです。」
 しか取る事が出来ないのです。

 Webアプリ/web.configで、<customErrors mode="Off" />を設定して
 WinアプリでキャッチしたエラーのInnerExceptionを見てみましたが、
 やっぱり空で、メッセージを取得する事が出来ませんでした…。

 なんとかして、Webアプリで発生させたエラーの
 メッセージ内容をWindowsアプリに渡す事は出来ないのでしょうか。
 もしくは、別の手段で実現する方法はないものでしょうか。

以上、長文になってしまいましたが、何でもいいので情報をよろしくお願い致します。
IIJIMAS
ベテラン
会議室デビュー日: 2006/12/06
投稿数: 77
投稿日時: 2007-09-26 22:04
Windowsアプリケーション側では

WebClient.UploadFile メソッド
http://msdn2.microsoft.com/ja-jp/library/system.net.webclient.uploadfile.aspx

または

HttpWebRequest.GetResponse メソッド
http://msdn2.microsoft.com/ja-jp/library/system.net.httpwebrequest.getresponse(VS.80).aspx
でファイルをアップロードして、

Webアプリケーション側ではResponse.BinaryWriteを使ってエラーや正常を示す何らかのデータを返すのはどうでしょうか。
HttpResponse.BinaryWrite メソッド
http://msdn2.microsoft.com/ja-jp/library/system.web.httpresponse.binarywrite(VS.80).aspx

詳細は各MSDNライブラリのページや関連ページをご参照ください。
未記入
会議室デビュー日: 2007/09/26
投稿数: 3
投稿日時: 2007-09-27 11:16
平素よりお世話になっております。

 やったーー、できました。しかも理想の形でした!。
 実は、エラーを発生させるのって気持ち悪いし、
 <customErrors mode="Off" />だとセキュリティ心配だし、
 本当はとってもイヤだったんです。

 要は、HTMLの中身で返せばいい、ということだったんですね。
 念の為、ソース掲載しておきます。

 ■Windowsアプリケーション----------------------------------------------------
 Imports System.Net
 Imports System.Text.Encoding

 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

   Try
     Dim strFILE As String = "(送信したいクライアントのファイル)"
     Dim strURL As String = "http://(Webアプリケーション仮想ディレクトリ)/Default.aspx"

     Using webClnt As WebClient = New WebClient()
       With webClnt
         'ファイル送信
         Dim retByte As Byte() = .UploadFile(strURL, strFILE)
         '戻り値を取得
         Dim ret As String = UTF8.GetString(retByte)
       End With
     End Using

   Catch ex As Exception
     Dim aaaa As String = ""
   End Try
 End Sub

 ■Windowsアプリケーション----------------------------------------------------
 Imports System.IO
 Imports System.Text.Encoding

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
   If IsPostBack = False Then

     'POSTされたファイルを取得する
     Dim uploadedFiles As HttpFileCollection = Request.Files
     For i As Integer = 0 To uploadedFiles.Count - 1

       'ファイルの書き出しを行う
       Dim userPostedFile As HttpPostedFile = uploadedFiles(i)
       userPostedFile.SaveAs("(サーバ上のファイル保管先)")

       '全ての出力内容をいったん削除
       Response.Clear()

       '正常終了を出力する

       Dim bytUTF8 As Byte() = UTF8.GetBytes("0|正常終了しました。")
       Response.BinaryWrite(bytUTF8)
       Response.End()
     Next i
   End If
 End Sub

以上、本当にありがとうございました。感謝感激です!。
今後ともよろしくお願い致します。
未記入
会議室デビュー日: 2007/09/26
投稿数: 3
投稿日時: 2007-09-27 11:19
(し、しまった…、最後の最後に間違えた)
2個目の「■Windowsアプリケーション-----」は
「■Webアプリケーション」の間違いです;;。
1

スキルアップ/キャリアアップ(JOB@IT)