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

わんくま同盟

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

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


■103420 / )  DropBoxAPIでのアップロードを失敗する。
□投稿者/ 高橋 (3回)-(2024/11/06(Wed) 12:59:17)

分類:[C#] 

開発環境:Microsoft Visual Studio Professional 2022 (64 ビット) - Current Version 17.8.6
使用言語:C#
フレームワーク:.Net8.0


昨晩投稿したつもりが投稿できていなかったので再投稿します。
もし重複していたら片方後日削除いたします。

DropBoxAPIを用いてファイルをアップロードする処理を書いています。
ただ、エラーを吐いてしまいうまくアップロードができません。
それについて3点ご教示いただけないでしょうか。
(1)このエラーの原因と対処法
(2)エラーメッセージのどこを見てどういう情報を調べれば独学でエラーを直せたか。
(3)内部例外2は内部例外1が原因で引き起こされているという理解でよいか。

【エラー内容】
System.AggregateException
  HResult=0x80131500
  Message=One or more errors occurred. (Error while copying content to a stream.)
(中略)
  この例外は、最初にこの呼び出し履歴 
    [外部コード] でスローされました

内部例外 1:
HttpRequestException: Error while copying content to a stream.

内部例外 2:
ObjectDisposedException: Cannot access a closed Stream.


【ソースコード】 ※一部投稿用に改編
private void button1_Click(object sender, EventArgs e)
{
    //HttpWebRequestでエラーが出る原因にTLS1.2が有効でないことがあるという記事を見たため。(多分関係ないっぽい)
    System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;
    using DropBoxAPI dropBoxAPI = new();
    {
        Task noWaitTask = dropBoxAPI.UploadFile("C:\\Users\\(ユーザー名)\\Desktop\\test.txt");
        //この下の行でエラーを吐きます。
        noWaitTask.Wait();
    }
}

public class DropBoxAPI : IDisposable
{
    private const string token = "(4時間限定トークン)";
    private readonly DropboxClient _DropBoxClient;

    public DropBoxAPI()
    {
        _DropBoxClient = new DropboxClient(token);
    }
    public Task UploadFile(string filePath)
    {
        string fileName = Path.GetFileName(filePath);
        using MemoryStream memoryStream = new(File.ReadAllBytes(filePath));
        return  _DropBoxClient.Files.UploadAsync("/"+ fileName, body: memoryStream);
    }
    //Dispose関連の処理(投稿省略)
}

【原因と疑った点】
(1)DropBoxのAPIの権限を適切に有効にしているか。 ⇒ とりあえずほぼすべてのWriteRead権限を設定する、アプリフォルダを設定するなど適切に設定したつもりです。、
(2)DropBoxのAPIで使用するトークンは4時間しか有効ではないのではないか。 ⇒ とりあえずテスト時点ではトークンを発行しなおしてすぐにコピペしています。将来的にはちゃんと考えないといけないですが。
(3)ファイルが存在しないとかいうミスはないか、 ⇒ 存在するファイルパスを指定しています。ファイルを消すとエラーを吐くのがMemoryStream行になるから多分適切にパスは指定しています。
(4)MemoryStreamじゃなくてFileStreamじゃないのか。 ⇒ 前者はメモリ、後者はファイルを取り扱うstreamで文法がちょっと違うということ以外よくわかっていませんがどちらでも試してはみました。
(5)async await waitの使い方がおかしくないか。 ⇒ 同期処理と非同期処理をよく理解していないのでここは本当によくわからずに書いています。でもデッドロックとかではなく、エラーを吐くので同期/非同期が原因ではないと思っています。

返信 編集キー/


管理者用

- Child Tree -