« 「ヘルシアスパークリング」を飲んでみた | トップページ | Baby Care Report ~2歳の記念撮影編~ »

2009年6月 3日 (水)

[VB.NET]行儀の悪いWebサーバのせーで「サーバーによってプロトコル違反が発生しました」が発生する場合の回避方法

System.Net.WebClientやSystem.Net.WebRequestを利用していて、ある特定のWebサーバとのやり取りすると・・・

サーバーによってプロトコル違反が発生しました. Section=ResponseStatusLine

と、WebExceptionがスローされる場合があります。
念のためWebExceptionのStatusプロパティを確認してみると"ServerProtocolViolation"となってたりします。

つまり、応答したWebサーバのレスポンスがHTTP的に正しくないため、.NET Frameworkの厳密なHTTPの検証に引っかかってしまってエラーとなるよーです。

メッセージ中のSectionが示している通り「ステータス行の不正」らしいので確認してみるとmsdn曰く本来のHTTPのステータス行は

HTTP/1.1 200 OK

と、ステータスコード(200)だけでなくステータスの説明(OK)も必要となるみたい。
ですが、今回の現象が起きたWebサーバは

HTTP/1.1 200

と、ステータスコードしか返さないためダメだったよーです。

.NET Frameworkがセキュリティを考慮して厳密なチェックを行っている訳ですのでサーバ側に改善を求めたいところですが、そーも言ってられないので、.NET Framework version 2.0以降は、上記エラーを無視できるよーになっています。

で、とりあえず今回は手軽なアプリケーション構成ファイル(App.config)で設定を行います。

おそらくStandard Editionなら「新しい項目に追加」でテンプレート内に「アプリケーション構成ファイル」があって追加できると思いますが、当方はMicrosoft Visual Basic 2008 Express Editionだったのでテンプレート内にアプリケーション構成ファイルがありませんでした。

なので、ソースが収められているディレクトリに空のApp.configファイルを作成して「既存の項目の追加」でプロジェクトに追加しました。

そして、App.configの内容を以下の様にして、httpWebRequest要素(ネットワーク設定)のuseUnsafeHeaderParsing属性をtrueにして厳密なHTTP検証を行わないようにします。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.net>
    <settings>
      <httpWebRequest useUnsafeHeaderParsing = "true" />
    </settings>
  </system.net>
</configuration>

この後にビルドやデバックを行うと、App.configがexeファイルと同じフォルダに「アプリ名.exe.config」としてコピーされて実行時に利用されました。

なので、配布時にはexeファイルと同時にApp.configの分身であるexe.configファイルも配布する必要があります。

ちなみに、HttpWebRequestElementクラスにUseUnsafeHeaderParsingプロパティが用意されててプログラムコードからでも上記設定を変更できるよーですが、にわか仕込みの私ではどーやって実装するのか良く分かりませんでした。_| ̄|○

|

« 「ヘルシアスパークリング」を飲んでみた | トップページ | Baby Care Report ~2歳の記念撮影編~ »

コメント

はじめまして。
RSS52mixiを使わせていただいています。
便利なツールをありがとうございます。
mixiに2回、Export(投稿)することができたのですが、
本日は「サーバーによってプロトコル違反が発生しました」となり、投稿できません。
ブログ内検索でこちらの解決法にたどり着いたのですが、私のレベルでは.net frameworkとなるとちんぷんかんぷんで何をどうすればいいのか良く分かりません。
すみませんが、もう少しご説明いただけないでしょうか?
当方の環境はクライアントはWin XP、ブログはJugem、DNSはムームーDNSを使っております。

投稿: LOVEGREEN | 2009年12月 2日 (水) 19:33

LOVEGREEN様、RSS52mixi作者のKAZU-です。
申し訳ありません。
RSS52mixiに同梱されているRSS52mixi.exe.configの内容に誤りがありまして上記記事の設定が有効になっていません。
先ほどRSS52mixiの配布内容を改めましたので、お手数ですが再度ダウンロードをしていただき上書きインストールしてください。
ご迷惑をおかけしました。m(_ _)m

投稿: KAZU- | 2009年12月 4日 (金) 05:24

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/26493/29921913

この記事へのトラックバック一覧です: [VB.NET]行儀の悪いWebサーバのせーで「サーバーによってプロトコル違反が発生しました」が発生する場合の回避方法:

« 「ヘルシアスパークリング」を飲んでみた | トップページ | Baby Care Report ~2歳の記念撮影編~ »