none
HttpWebRequestのヘッダ設定方法について RRS feed

  • 質問

  •  

    HttpWebRequestクラス(.NET Framework2.0)の以下のリクエストヘッダ/値設定方法やヒントについてご存じの方がいらっしゃいましたら、何卒ご教授下さい。

     

    ①Connection: Close

    HttpWebRequest.Connection プロパティに対して"Close"をセットすると

    ArgumentException(Connection の値が Keep-alive または Close に設定されています。 ) が発生します。

    HttpWebRequest.KeepAlive プロパティに対して false を設定することにより、 ヘッダにConnection: Close を設定したものとみなせるのでしょうか。

    (ヘルプには「KeepAlivefalse に設定すると、Connection: Close ヘッダーがサーバーに送信される[ことがあります]。」とあるため、不安になりました。)

     

    ②Connection: Close, TE

    こちらについては、「,TE」の設定方法が皆目見当つきません。

    そのままHttpWebRequest.Connection プロパティに対してセットしたところ、Closeのみの場合と同様にArgumentExceptionが返されてしまいました。

     

    以上、宜しくお願い致します。

    2007年8月22日 6:18

すべての返信

  • 外池と申します。

     

    最初のご質問について、私の意見では、KeepAliveをFalse設定してやれば、Connectionも自動的に設定されると思うので、ことさら、Closeを代入してやる必要はないと思います。もし、どうしても設定したいならば、一度、null(VBならNothing)を代入してやって、改めて"Close"を代入してやればよいかと思います。しかし、それでもなお、実際のサーバーへの要求でConnection: Closeのヘッダーが送信されるかどうかは、システム任せではないかと思います。

     

    二つ目の質問は、すいません、質問の趣旨自体がわかりません。TEって、何に書いてある記号なんですか?

     

    2007年8月22日 6:42
  •  

    外池様

     

    早速のコメント、どうも有難うございます。

     

     外池 さんからの引用

    それでもなお、実際のサーバーへの要求でConnection: Closeのヘッダーが送信されるかどうかは、システム任せではないかと思います。

     

    やはり、厳密に送信ヘッダへのConnection: Close指定が要求されるケースではHttpWebRequestではなく、

    System.Net.Sockets.Socketでバイト配列のリクエストヘッダを直接送り込むしかないんでしょうか。

     

     外池 さんからの引用

    TEって、何に書いてある記号なんですか?

     

    HTTP1.1のConnectionヘッダへのホップバイホップヘッダ指定です。

    何となく、

    HttpWebRequest.Connectionプロパティは何も設定せず、TransferEncoding プロパティが設定されている(Chunkedの場合はSendChunked プロパティ?)場合かつKeep-aliveプロパティがfalseの時に、これまた暗黙的にConnection: Close,TEで送信されそうな淡い期待があるのですが。。。

    ヘルプを読み解く力がなく、恐縮です。

    2007年8月22日 7:06
  • 外池です。

     

    まず、結論ですが、仰るとおり、厳密に、プログラマの意図どおりに動作させたいならば、より低位のクラスを使うしか方法はないと思います。と言うのも・・・、Internet Explorerでさえ、KeepAliveの動作に関して、特定のサーバーと相性が悪くて不具合を起こす事例があったと記憶しています。しかも、IE6が不具合、IE7なら具合よし、というような感じだったりしますから。

     

    以下、独り言モードの愚痴です。

     

    ヘルプの読解力自体は、私も大差なく、試行錯誤の連続です。って言うか、やはり、ヘルプの記述量は少なすぎると思います。どの標準に沿っているのか、沿っていない例外は何か、キチっと明記されていないことが多すぎます。

     

    「~することもあります。」や「~する場合もあります」(いずれも、そうなる条件の説明なし)なんて言う表現が、何で開発者向けドキュメントに許されるのか、まったく理解できません。乱暴ですが、間違っていてもいいから言い切ってもらって、その上で、間違いを指摘されたらタイムリーに修正していくことが大事だと思っています。(その修正が「ぼやかした表現にして逃げる」というやり方だと、元も子もないですが。なんで、飛ぶ取り落とす勢いのMicrosoft社が姑息な官僚主義者の言い逃れのような言葉遣いするかなぁ。)

     

    私の場合は、職場内の内製ソフトの作成と運用だけなので、特定のマシン間で動作すればハッピーなのですが、広く頒布するソフトの場合は非常に苦労が多いとお察しします。

     

    私の場合は暴言吐いても一向に痛むことはありませんが、吐けない方々も多いわけで、これも、一層、お察しします。(拝)

     

     

     

    2007年8月22日 8:15
  •  

    外池様

     

    コメント有難うございます。

    とりあえず、手近なproxyでKeepAliveプロパティ、SendChunkedプロパティ設定の組み合わせでリクエストヘッダを拾ってConnection: Close(,TE含む)がヘッダに設定される場合、されない場合を検証しようとは思います。

    先の長い話なので、とりあえずSocketを使ったバージョンも実装しましたが、制約は多いもののHttpWebRequestが使えればSocと比較して手順を相当省けそうなので期待が捨てられない私。

    2007年8月22日 9:56