勘違い(MultipartFormDataContent+WebAPI)

メール送信を行なう、WebAPIを作成しようとして、以下のようなインターフェイスを考えた。

[HttpPost]
public async Task<SendMailStatus> PostAsync(
    [FromForm]string? FromAddress,		// 送信者アドレス
    [FromForm]string? Password,			// (暗号化された)パスワード
    [FromForm]string[]? ToAddresses,	// 送信先(複数指定可)
    [FromForm]string[]? CcAddresses,	// Cc(複数指定可)
    [FromForm]string[]? BccAddresses,	// Bcc(複数指定可)
    [FromForm]string? Subject,			// 件名
    [FromForm]string? Message,			// 本文
    [FromForm]IFormFile[]? Attachments	// 添付ファイル(複数指定可)
) {
	・・・

添付ファイルがあるので、当然、multipart/form-dataとして、クライアントからデータをPOSTしなければならないのだが、この作成方法に引っかかってしまったのであった。

MultipartFormDataContent構造体を使用するのは分かっており、これにファイルを追加するにはBinaryContent構造体を使用すれば良いことも分かっていたのだが、それ以外のFormデータを「Formデータだから、FormUrlEncodedContent構造体を作って、それを追加すればいいんじゃ無いか?」と勝手に思い込んで、色々試したが、ファイル(コード上はAttachments)は取れるのだが、他の引数はうまくデータがとれず、「何じゃこれは?」となった・・・

色々調べて、結局FormUrlEncodedContentでまとめて入れるのでは無く、以下のように個々のパラメータ(key=値)をStringContentとして別々に追加しなければいけないことが分かった。

// マルチパートMime
MultipartFormDataContent MimeData = new MultipartFormDataContent();

// 送信元
StringContent ctx = new(FromAddress);
MimeData.Add(ctx,"FromAddress");

// パスワード
string encPwd = EncryptPassword(Password));
ctx = new(encPwd);
MimeData.Add(ctx,"Password");

// 宛先
foreach(string s in ToAddresses) {
    if (s != null) {
        ctx = new(s);
        MimeData.Add(ctx,"ToAddresses");
    }
}
	・・・
// 添付ファイル
foreach(var a in Attachments) {
    MemoryStream stm = new MemoryStream();
    await a.CopyToAsync(stm);
    await stm.FlushAsync();
    byte[] buf = stm.ToArray();
    ByteArrayContent c = new ByteArrayContent(buf);
    MimeData.Add(c,"Attachments",a.FileName);
}
await cli.PostAsync("・・・",MimeData);

まったく、基礎がなっておりませぬな・・・

無駄な時間を使ってしまった・・・

takezou について

ソフトウェア開発会社(ITと言う言葉は大嫌い)で働く、元技術者。 未だに、社内システム位は作ってますが・・・ プログラミング言語はC#が好き。 好きなことだけ拾って投稿しているので、内容にはあまり期待しないでねw
カテゴリー: .NET, asp.net core, C#, Web, 技術系 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください