忍者ブログ

マジックナンバー

彼と時間を共有するぼくは、彼の何を知り得るのだろう

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

HttpClientの417 Expectation Failed

Visual Studio 2012 C#で、GUIアプリケーションの作成が簡単にできるので最近はまってます。
HttpClientクラスという、HTTP通信をすごく簡単にできるライブラリがあるのもC#にはまった要因。
C++だとboostを使ってもHTTP通信するのはまだ少しめんどくさいので...
cpp-netlibというboost.asioをラップしてくれてるライブラリもあるんですが、
SSLとかそこら辺を自分で実装する必要があるとかないとか(適当)
あのmakeファイルを作ると噂されるCMAKEも使いこなせないので・・・C++は途中で心が折れました。
そろそろ本題に・・・
HttpClientは.NET Framework 4.5から追加されたらしい比較的新しいクラスです。
これを使うと簡単に非同期なHTTP通信もできちゃったりなんかして、すごい便利!
ですがPostメソッドを使って通信すると、なぜか417エラーが戻ってくることがあるので。。。
(参考:Studying HTTP 様 → 「リクエスト継続」を認めない場合(417レスポンス)
いろいろとメモしておきます。(たぶん忘れてまた悩むことになるので・・・
といってもDev Centerに書いてあることですケド!

要点をまとめると
・HttpRequestMessageのExpectContinueをfalseにする
・PostAsyncメソッドの代わりに、SendAsyncメソッドを使ってHttpRequestMessageを送信
以上です。

ただ、SendAsyncメソッドを使うと、PostAsyncメソッドで自動的にやってくれてた処理を
自分でやらなくちゃいけないみたいで。。。
HTTPヘッダやメッセージボディの書き方とかさっぱりわからんのでぐぐりながら。
var _url = "http://2bit.kagome-kagome.com/"; //Post先のURL
HttpRequestMessage _message = new HttpRequestMessage( System.Net.Http.HttpMethod.Post, _url );
_message.Headers.ExpectContinue = false; //かの有名なExpectContinue
//PostしたいデータをDictionaryで定義
var _postData = new Dictionary<string, string>
{
  { "hoge", "hogehoge" },
  { "fuga", "fugafuga" }
}
//SendAyncで送信するContent
var _postContent = new System.Net.Http.FormUrlEncodedContent(_postData);
//byte[]に変換してpostするデータの長さを求める(もっといいやり方が絶対ある)
byte[] _postContentByte = _postContent.ReadAsByteArrayAsync().Result; //ぜんぜん同期的じゃない
_message.Content = _postContent; //メッセージボディ(多分
_message.Content.Headers.ContentLength = _postContentByte.Length; //メッセージボディの長さ(多分
_message.Content.Headers.ContentType = new  MediaTypeHeaderValue("application/x-www-form-urlencoded");
あとはHttpClientのSendAsyncメソッドの引数に_message(HttpRequestMessage)を渡してあげれば完了です!
理解せずにいろいろ使ってるので、用法用量間違ってると思いますが
こんな感じでとりあえず417エラーは返ってこなくなりました!ばいばい417!

TwitterのAPIをC#から使うときは
System.Net.ServicePointManager.Expect100Continue = false;
をすればいいというのはすぐ見つかったんですけど、
HttpClientだと意味がないんですかね...期待通りの動作をしてくれなかった


*4/28 追記*
わざわざHTTPリクエストをSendAsyncメソッドで送信しなくても
httpClient.DefaultRequestHeaders.ExpectContinue = false;
とすれば、PostAsyncメソッドを使っても417が返ってこなかった!
こっちの方が簡単じゃないか!!

コメント

お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字

プロフィール

HN:
No Name
性別:
非公開
自己紹介:
浅学非才の若輩者ですが、がんばります!

カレンダー

09 2017/10 11
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

フリーエリア

最新CM

[05/24 NONAME]
[05/24 NONAME]
[12/08 NONAME]
[11/27 みかき]

ブログ内検索

P R