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

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

新規登録して質問してみよう
ただいま回答率
85.37%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

C#

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

20682閲覧

[c#]httpClientを使ったマルチパートによるPOST処理についての質問です。

makiikeda1216

総合スコア128

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

C#

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

3クリップ

投稿2014/10/09 06:56

.NET Framework4.5のSystem.NET.Httpを使ったMultiPart形式の画像データのPostのプログラムを作成しているのですが、Errorが修正できず、困っています。どなたかご教授お願いします。以下に詳細、例外とソースを張っておきます。

詳細:
JPG画像データをMemoryStreamに保存し、MultipartFormDataContent()にAddメソッドでStreamを追加しPOSTを行っていますが"System.Net.Http.HttpRequestException"が発生します。
JPG画像データをByteコードに変換してPOSTを行うと成功します。
MemoryStreamに文字列を保存し,POSTを行うと成功します。
使用しているJPG画像のサイズは100KBほどです。

例外:System.Net.Http.HttpRequestException
内容:Error while copying content to a stream

lang

1public async Task PostAsync(string url,string newFilePath) 2 { 3 using (var httpClient = new HttpClient()) 4 { 5 using (var postData = new MultipartFormDataContent()) 6 { 7 Image image = Image.FromFile(newFilePath); 8 using (MemoryStream ms = new MemoryStream()) 9 { 10 image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 11 ms.Position = 0; 12 13 postData.Add(new StreamContent(ms)); 14 } 15 16 ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => 17 { 18 return true; 19 }; 20 var response = await httpClient.PostAsync(url, postData).Result.Content.ReadAsStringAsync(); 21 22 richTextBox1.AppendText(response.ToString()); 23 } 24 25 } 26 } 27 28 private async void button1_Click(object sender, EventArgs e) 29 { 30 try 31 { 32 await PostAsync("http://127.0.0.1:8080/","filename"); 33 } 34 catch (AggregateException ex) 35 { 36 foreach (var inner in ex.InnerExceptions) 37 { 38 richTextBox1.AppendText(inner.Message); 39 richTextBox1.AppendText(string.Format("Type : {0}", inner.GetType())); 40 } 41 } 42 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

Content-DispositonとかContent-Typeに関する設定が必要だったりしないでしょうか?

StreamContentにHeadersというのがあると思うので、そこで設定しないといけない気がします。

投稿2014/10/09 07:14

TaMaMhyu

総合スコア1356

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

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

makiikeda1216

2014/10/09 09:14

TaMaMhyuさん早速の回答ありがとうございます。 >Content-DispositonとかContent-Typeに関する設定が必要だったりしないでしょうか? StreamContent stream = new StreamContent(ms); stream.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data"); stream.Headers.ContentDisposition.Name = "filename"; stream.Headers.ContentDisposition.FileName = "JPG"; stream.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); postData.Add(stream); とHeader情報を追加してみましたが、やはり同じ例外が発生してしまいました。
TaMaMhyu

2014/10/09 09:42

改めて例外の内容を見ると、ストリームを使うタイミングではストリームが閉じていて使えないと言っているような気がしてきました。
TaMaMhyu

2014/10/09 09:49

MemoryStreamがusingを抜けて開放された状態でMultipartFormDataContentからアクセスされて失敗している気がします。
makiikeda1216

2014/10/09 10:32

なるほど!よく見てみたらそうでしたOTL Streamを破棄したあとにデータをポストしていました。 多分コレだと思います! multi part 処理でusingを使うとこんな落とし穴があるとは.. 明日試して結果を投稿させていただきます!
makiikeda1216

2014/10/10 00:18

Errorが直りました!ありがとうございます! やはりusingの部分でした。 public async Task PostAsync(string url,string newFilePath) { using (var httpClient = new HttpClient()) { using (var postData = new MultipartFormDataContent()) { Image image = Image.FromFile(newFilePath); MemoryStream ms = new MemoryStream() image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); ms.Position = 0; postData.Add(new StreamContent(ms)); ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => { return true; }; var response = await httpClient.PostAsync(url, postData).Result.Content.ReadAsStringAsync(); ms.Dispose(); richTextBox1.AppendText(response.ToString()); } } } とすることで動きました。 本当に感謝です!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問