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とは相性が悪そうです。僕の記憶にあるあなたのままで僕はとっても安心しました(嘘)