質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

1回答

4230閲覧

HTTPClientで画像アップロードするリクエストのboundaryが「"」で囲われないようにする方法を教えてください

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2021/09/04 03:19

編集2021/09/04 09:48

お世話になります。

現在ASP.NET(C#)のMVCアプリから外部のサービスに画像をアップロードする処理を作成しています。
開発環境は以下になります。
Windows10
Visual Studio(2012)
.NET Framework(Ver4.6.2)

MSのサンプルを参考に実装しましたがアップロードには成功していません。

原因はリクエスト情報の区切り文字(boundary)がダブルクウォートで囲われている事です。

下記の「request」の「Content-Type」に設定されている区切り文字の値が
boundary="----------------------------74eee5798fec"
となっていますが、これがダブルクウォートで囲われない
boundary=----------------------------74eee5798fec
となればアップロードが成功しました。
※Fiddlerで強引にリクエスト情報を修正して試しました。

区切り文字にダブルクウォートを付与させない方法をご存じの方ご教授お願いします。

・MultipartFormDataContentクラスの仕様でダブルクウォートは付与されるようです。
・HttpWebRequestを使用すればダブルクウォートを付与させないことは可能なのですが、MSがHttpWebRequestの利用を推奨していないためHttpClientで実装しています。

C#

1var url = "https://XXXXXXXXXXXXXXXXXXXXXXXXX"; 2var requestMessage = new HttpRequestMessage(HttpMethod.Post, uri); 3requestMessage.Headers.Add("Ocp-Apim-Subscription-Key", accessKey); 4 5var image = File.ReadAllBytes("画像のファイルのパス"); 6 7var boundary = "74eee5798fec"; 8var content = new MultipartFormDataContent(boundary); 9content.Add(new ByteArrayContent(image), "image", "myimage"); 10requestMessage.Content = content; 11 12var httpClient = new HttpClient(); 13 14Task<HttpResponseMessage> httpRequest = httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseContentRead, CancellationToken.None); 15HttpResponseMessage httpResponse = httpRequest.Result; 16 17

request

1POST /openapi/message/upload.api HTTP/1.1 2Host: storage.worksmobile.com 3consumerKey:LQwDde6x8eV4ROOCOdSW 4authorization: Bearer AAAA67h9/36ItvAEea7G8ijrDeCy/22BO5IcP0/KkwZO6unIYET6xkmp3RLW 5x-works-apiid: jp1AqBWcedRFt 6Content-Length: 11410 7Content-Type: multipart/form-data; boundary="----------------------------74eee5798fec" 8 9------------------------------74eee5798fec 10Content-Disposition: form-data; name="resourceName"; filename="sample.png" 11Content-Type: application/octet-stream 12 13.PNG***(skip) 14------------------------------74eee5798fec--

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/09/04 03:45

> 現在ASP(C#)で外部サービスに画像をアップロードする処理を作成しています。 ASP と言うとクラシック ASP を想像しますが、そうではなくて ASP.NET ですよね? であれば質問文を編集して訂正願います。 ASP.NET がどう関係しているのですか? ASP.NET のサーバーから外部に画像をアップロードしたい? 何を作っているか(Web Forms? MVC? Web API? その他?)と開発環境(OS, Visual Studio のバージョン、.NET Framework or Core のどっちかとそのバージョン)を質問欄を編集して追記してください。
退会済みユーザー

退会済みユーザー

2021/09/04 09:34

ご指摘ありがとうございました。 業務に関する所もあるため可能な範囲内で追記しました。 ご確認お願いします。
guest

回答1

0

ベストアンサー

質問に対する私のコメントに返事がないので、どのように HttpClient を使っているのかとか、開発環境(特に .NET Framework なのか Core なのか)などいろいろ不明ですが、とりあえずレスしておきます。

Content-Type: multipart/form-data; boundary=----------------------------"74eee5798fec"

------------------------------74eee5798fec

それが HttpClient を使った場合の結果ですか? 

自分の .NET Framework 4.6.1 の WinForms アプリでは様子が違います。以下の記事の一番下の画像のように、要求ヘッダに設定される boundary は GUID の文字列になり全体が "" で囲われます。

HttpClient でファイルアップロード
http://surferonwww.info/BlogEngine/post/2019/08/11/file-upload-by-using-httpclient.aspx

上の記事で検証した際に使った Web サーバーは IIS 10 でアプリは ASP.NET Web Forms ですが問題なくアップロードされた画像を取得できています。

念のためもう一度やってみましたが同じ結果でしたね。サーバー側での画像ファイルの取得も問題なしです。

イメージ説明

"" で囲うなら boundary="----------------------------74eee5798fec" のように全体を囲わなければならないということではないかと思います。

質問者さんの結果と上の記事で紹介した私の検証結果が何故違うのかは分かりません。上の記事のコードとご自分のコードを見比べてみてはいかがですか? どこか違うところがその結果を生んだのかも。

HttpWebRequestを使用すればダブルクウォートを付与させないことは可能なのですが、MSがHttpWebRequestの利用を推奨していないためHttpClientで実装しています。

確かに "新しい開発には HttpWebRequest を使用しないことをお勧めします" と書いてありますけど、.NET Framework の ASP.NET Web アプリならやむを得ないと自分は思います。

HttpClient を ASP.NET Web アプリのサーバーで使うのは socket の枯渇という悩ましい問題があります。ASP.NET Core なら以下の記事に書いたような解決策はあります。

ASP.NET と HttpClient (CORE)
http://surferonwww.info/BlogEngine/post/2020/11/08/use-of-httpclient-in-aspnet-application.aspx

.NET Framework 版の ASP.NET Web アプリでも Microsoft のドキュメントによれば解決方法があるそうです(上に紹介した記事から張った url を参照ください)。でも、自分としてはその解決策はかなり疑問で採用する気にはなれないです。もし問題が起きたら Microsoft のせいにできるのであれば話は違うかもしれませんけど。

投稿2021/09/04 05:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/09/04 09:54

ご回答ありがとうございます。 まず区切り文字に関して誤記がありましたので修正しました。 誤)boundary=----------------------------"74eee5798fec" 正)boundary="----------------------------74eee5798fec" 今回画像をアップロードしたいサービスは下記になるのですが https://developers.worksmobile.com/jp/document/1005025?lang=ja こちらだと区切り文字がダブルクウォートで囲われているとエラーになります。 .NET Framework の ASP.NET Web アプリなら(HttpWebRequestの使用も)やむを得ないと自分は思います。 よろしければ上記の理由を教えていただけないでしょうか。 よろしくお願いします。
退会済みユーザー

退会済みユーザー

2021/09/04 12:09 編集

> こちらだと区切り文字がダブルクウォートで囲われているとエラーになります。 サーバーが "" で囲った boundary をサポートしてないということなんでしょうかね。そういうサーバーは相手にしない・・・という訳にもいかなそうなのでクライアント側で "" で囲われないようにする他なさそうですが、であれば以下の記事の最初の回答のようにすれば "" は削除されるはずです。お試しください。 HttpContent boundary double quotes https://stackoverflow.com/questions/30926645/httpcontent-boundary-double-quotes > よろしければ上記の理由を教えていただけないでしょうか。 それは上の回答と紹介した記事に書いたつもりなのでよく読んでもらえませんか。
退会済みユーザー

退会済みユーザー

2021/09/04 14:54

参考にします。 アドバイスありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問