C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 126 を表示中)
■74877 / )  Re[5]: WebDAVサーバーファイルアップロードのエラー
□投稿者/ DSC渡邊 (8回)-(2015/02/05(Thu) 09:57:34)
DSC渡邊 さんの Web サイト
No74873 (れい さん) に返信

懇切丁寧な説明ありがとうございます。助かります。

教えて下さったコードは早速参考にさせていただきました。
ただ、「 request.UnsafeAuthenticatedConnectionSharing = True 」  にすると「転送接続にデータを書き込めません」というエラーが発生しました。
どうやら、サーバーの認証プロトコルはNTLMかKerberos等ではないようです。

最終的には以下のようなソースコードでアップロードに成功しました。
----------------

            Dim fileToUpload As String
            Dim fileLength As Long
            Dim url As Uri
            Dim nc As New NetworkCredential(ユーザー名, パスワード)
            Dim cc As New CookieContainer 'for tracking session
            Dim request As HttpWebRequest

            '空ファイルPUT
            fileToUpload = アップロード元ファイルのフルパス
            Using fs As New IO.FileStream(fileToUpload, IO.FileMode.Open, IO.FileAccess.Read)
                fileLength = fs.Length
                url = New Uri(サーバーのURL & "/" & サーバーのアップロード先フォルダ & IO.Path.GetFileName(fileToUpload))
                request = DirectCast(System.Net.HttpWebRequest.Create(url), HttpWebRequest)
                request.Method = WebRequestMethods.Http.Put
                request.Headers.Add(HttpRequestHeader.Allow, "PUT") ' for EmptyPUT
                request.AllowWriteStreamBuffering = True
                request.PreAuthenticate = True
                request.Headers.Add("Translate: f") ' for IIS
                request.Credentials = nc
                request.CookieContainer = cc
                request.ContentLength = 0
                Using res As HttpWebResponse = request.GetResponse()
                    url = res.ResponseUri
                End Using

                request = DirectCast(System.Net.HttpWebRequest.Create(url), HttpWebRequest)
                request.Method = WebRequestMethods.Http.Put
                request.ContentLength = fileLength
                request.SendChunked = False
                request.AllowWriteStreamBuffering = False 'no-buffering
                request.PreAuthenticate = True ' for sharing auth info
                request.AllowAutoRedirect = False
                request.Headers.Add("Translate: f")
                request.Credentials = nc
                request.CookieContainer = cc
                request.Timeout = 600000               ''タイムアウト600秒
                Using reqst As IO.Stream = request.GetRequestStream()
                    Dim bytes(102400 - 1) As Byte
                    Dim bytesRead As Integer = 0
                    Dim totalBytesRead As Long = 0
                    Do
                        bytesRead = fs.Read(bytes, 0, bytes.Length)
                        If bytesRead > 0 Then
                            totalBytesRead += bytesRead
                            reqst.Write(bytes, 0, bytesRead)
                        End If
                    Loop While bytesRead > 0
                End Using
            End Using

            Dim code As HttpStatusCode
            Using response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)
                code = response.StatusCode
                If code >= 300 AndAlso code < 400 Then Throw New Exception
            End Using

----------------

処理効率も良くなったようで、昨日の800MBのファイルで2分程かかったアップロード時間が1分30秒を切るようになりました。

本当にありがとうございました。

解決済み
返信 編集キー/


管理者用

- Child Tree -