WebRequestのExpectにデフォルトで100-continueがつく件
ちょっとしたこと(漢字コードの変換楽々で行きたい!)でC#を使ってみて、ちょっとしたこと(WebRequestのデフォルトのヘッダに Expect: 100-continue が勝手につく)で困ったりしたので、その備忘録。
100-continueって何?
HTTPではクライアントからサーバにリクエストを送る場合、ヘッダに続いてボディを送る事になる訳ですが、
- そのメソッドダメ!
- リクエスト長過ぎ!
- そのフォーマットしらね!
などの理由で受け付けてくれない場合があります(いわゆる4xx系エラー)。この際、ボディが長大だったりすると、単純に帯域の無駄。もったいないです。特にKeep-Aliveしてたりしてソケットを再利用している場合に、勝手にぶちきられた挙げ句エラーを返してくれず、送りまくった後で「さあ、僕の愛をウケてくれ!」と言った瞬間に「貴方とはお付合いできません、ていうかー、聞いてなかったのー」なんてつれない返事が帰ってきてしまうと悲しすぎ。
http://matome.naver.jp/odai/2129352806922744101/2129353031422770403
そこで、HTTP/1.1では「先に答おしえて!」と要求できるようになりました。これが Expect: 100-continue。サーバは「とりあえず聞いてあげる」なら100 continueを返します。クライアントは取り合えずヘッダだけ送って、サーバの返事をまち、4xx系ならやめ。100 系なら送る、という手順をとれるようになります。
問題なのはこの 100-continueに対応してないサーバ(HTTP接続な認証サーバとか)がいるという事なのですね。この場合要求された時点で 417 を返してきます。
.NETのWebRequest
.NETにて簡単にHTTP接続するにはWebRequestを使う訳なのですが、これがデフォルトでは強制的に Expect: 100-continueを送るように固定されていて、これで 417が帰ってきてしまうと、Response貰えなくなってしまいます。別にいらんちゅうに勝手な事してー、というところまではまあワガママと言えなくもないのですが、問題なのはこの外し方。単純に
webreq.Expect = null; // or ="";
とかでは消えてくれなくて、
webreq.ServicePoint.Expect100Continue = false;
とか、「なんでよ?!」と言いたくなるような方法になっている事。いかにもMSらしい。しかも Method = "POST"; の位置によってどうもウマく言ったり行かなかったり。
あーもーわけわからん
結論
やっぱり僕はMicroSoftとは相性が悪そうです。僕の記憶にあるあなたのままで僕はとっても安心しました(嘘)