• ベストアンサー

http Hostヘッダの設定

VB.NET2008で RESTでhttpヘッダのHostを指定する必要があるプログラムを組んでいます。 WebClientクラスで行おうと思っているのですが、 WebClient.Headers.Add("Host","www.xxxx.co.jp")だと WebClient要求で例外が発生しました。 エラーが発生してしまいます。 Hostを指定することはできないのでしょうか? Socketを使用すればできるのはわかるのですが、SSL使用のため、敷居が高くて・・・ お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

SslStream.WriteTimeout/ReadTimeoutは元となるストリームの同プロパティを呼び出しているだけのようです。 元はNetworkStreamなのでこちらを見てみるとReadTimeoutプロパティの説明に このプロパティで指定した時間内に読み取り操作が完了しない場合、読み取り操作は IOException をスローします。 同じくWriteTimeoutプロパティも このプロパティで指定した時間内に書き込み操作が完了しない場合、書き込み操作は IOException をスローします。 となっているので、どちらもTry-Catchですね。実際に試してはいませんが。投げられるのが単なるIOExceptionだと、タイムアウト以外でも投げられる可能性があるかも・・・? そうなると判定は厄介ですね。Exception.Dataにタイムアウト特有の値があったりすれば判別可能ですけど。。。

papope
質問者

お礼

ご回答ありがとうございます。 確かにsslStream.WriteTimeoutの説明を見るとオーバライドしていますね。 IOExceptionで返ってくるにしても他の異常でも投げられますよね・・。 タイムオーバーの環境を強引に作成して試してみます。 結果をここに載せたいと思いますので、しばらくお時間をください。

その他の回答 (3)

回答No.3

> sslStream.Write Readでなくても大丈夫なのでしょうか? HTTPのヘッダに関してはリクエスト・レスポンスともに文字セットはUS-ASCII、改行コードは CR+LF で規定されてるはずです。なので、ASCIIエンコードのStreamWriter/Readerで読み書きちゃって大丈夫だと思います。 ただReadに関してHTML本体はヘッダのContent-Typeや<meta>で定義されたcharsetによるので、ヘッダと本体は本来別々に読まないといけないんですけど手抜きでまとめ読みしてます。。。 SslStreamの使用例があまりネットにないようなので、#2に投稿したコードを元にクラス化したコードをブログに載せました。よろしければそちらもごらんになってみてください。

参考URL:
http://wiz.came.ac/blog/2009/11/vb-2005https.html
papope
質問者

お礼

ご回答いただきまして、ありがとうございます。 ご返答が遅くなり申し訳ありません。 サンプルまで載せていただき、助かります。 ここで、別の質問にもなるのですが sslstreamを使用している場合、タイムアウトは sslStream.ReadTimeout、sslStream.WriteTimeoutで可能だと思うのですが、 タイムアウトが発生した場合、その状態をキャッチするには、どのように したら良いのでしょうか?

回答No.2

Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click   ' 指定したホストと接続したSSLストリームを取得   Using srm As IO.Stream = GetSslStream("hogehoge")     ' HTTPリクエストの作成     Dim writer As New IO.StreamWriter(srm, System.Text.Encoding.ASCII)     writer.WriteLine("GET /index.html HTTP/1.0")     writer.WriteLine()     writer.Flush()     ' HTTPレスポンスの読み込み     Dim reader As New IO.StreamReader(srm, System.Text.Encoding.ASCII)     Dim stb As New System.Text.StringBuilder()     While Not reader.EndOfStream       stb.AppendLine(reader.ReadLine)     End While     TextBox1.Text = stb.ToString()   End Using End Sub ' 指定したホストにHTTPSで接続 Private Function GetSslStream(ByVal RemoteHost As String) As IO.Stream   ' TcpClientで接続   Dim client As New Net.Sockets.TcpClient()   client.Connect(RemoteHost, 443)   ' サーバー証明書の確認用メソッドのデリゲート   Dim callback As Net.Security.RemoteCertificateValidationCallback   callback = AddressOf ConnectionRemoteCertificateValidationCallback   ' SSLストリームの作成とサーバー証明書の取り込み   Dim ssl As New Net.Security.SslStream(client.GetStream(), True, callback)   ssl.AuthenticateAsClient(RemoteHost)   ' ストリームを返す   Return ssl End Function ' 証明書の内容チェック用コールバック Private Function ConnectionRemoteCertificateValidationCallback( _   ByVal sender As Object, _   ByVal certificate As System.Security.Cryptography.X509Certificates.X509Certificate, _   ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, _   ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors) As Boolean   ' すべての証明書を許可   Return True End Function End Class 恐ろしく手抜きなコードですがこんな具合です。

papope
質問者

補足

早速のご返答ありがとうございます。 1点質問なんですがリクエストの読み書きにIO.StreamWriter Readerを 使用していますが、sslStream.Write Readでなくても大丈夫なのでしょうか?

回答No.1

手作業でヘッダに追加しなくても、ダウンロード系メソッドでURIを指定すれば、そのホスト名がヘッダに付加されるはずです。 URIと違うホスト名を指定、などの状況なのでしょうか?? どちらにしてもWebClientの要求ヘッダでHostの書き換えは不可のようです。 SSL通信は TcpClient と SslStream を使えばそれほど敷居高くないですよ。

papope
質問者

補足

ご回答ありがとうございます。 詳細は分かっていないのですが、業者指定のホスト名を指定しなくてはならないのです。 WebClientではHostの書き換えは不可能ですか・・・ SslStreamの詳細の説明が見つからなくって困ってます。 説明しているサイトなどありましたら紹介お願いいたします。 (自分でももう一回調べます)

関連するQ&A

  • WebClientの文字列送信にてエラー

    .net のWebClientを使用して文字列をアップロードしているのですが、上手くいかず以下のようなエラーが返されます。 エラー内容:「サーバーによってプロトコル違反が発生しました. Section=ResponseHeader Detail=ヘッダー名が無効です。」 [環境] VS2005 VB.NET [ロジック] Using wc As New System.Net.WebClient wc.Encoding = System.Text.Encoding.GetEncoding("shift_jis") wc.Headers.Add("Content-Type", "application/x-www-form-urlencoded") wc.Credentials = New System.Net.NetworkCredential(user,pass) Dim url As New System.Uri("http://指定のURL") Dim returnvalue As String = wc.UploadString(url, "POST", "送信文字列") End Using 補足ですが、通信にはベーシック認証を使用していますが、ユーザー・パスは問題ありません。 UploadStringAsyncを使用すれば文字送信はできています。 通信結果をサーバーより取得するためUploadStringを使用しています。 どなたか解決策をご存知の方はご教授いただきたいと思います。 宜しくお願い致します。

  • 指定URLのヘッダー情報取得について

    お世話になっております。 現在指定したURLよりヘッダー情報を取得する処理の確認をしているのですが 指定URL先のHTMLファイルからうまくヘッダー情報を取得することができません。 javaおよびURL先のHTMLは以下のようになっております。 [java] HttpClient client = new HttpClient(); String raddr = 指定URL; GetMethod gMethod = new GetMethod( raddr ); Header addr = new Header("ADDR", raddr); gMethod.setRequestHeader(addr); client.executeMethod( gMethod ); Header[] headers =gMethod.getRequestHeaders(); for(Header h : headers) { logger.trace("getHeader : " + h.toString()); } [HTML] <html> <head> <META http-equiv="Set-Cookie" content="cookievalue=aaa;expires=Sun, 20-Sep-1996 11:10:11 GMT; path=/"> <META http-equiv=Content-Type content="text/html; CHARSET=UTF-8"> <title>notitle</title> </head> <body>test</body> </html> javaの変数addrまでは取得できており取得したURLへとぶとHTMLの中身が確認できますが java上でHeaderの内容が確認できません。 実際はSet-Cookieの内容を取得したいのですがヘッダーで取得された内容は ユーザーエージェントとHostのみでした。 どうにかHTML側でjavascriptを使用せずにSet-Cookieの記述のみで java側にSet-Cookieの内容を取得させたいのですが なぜヘッダー情報が取得できないのかご教授のほどよろしくお願いします。

    • ベストアンサー
    • Java
  • PHP Windows版のmail()を使用して添付ファイルを送りたい

    はじめて、質問させていただきます。 環境はWindowsXP(Pro)+IIS+PHPです。 PHPのmail()関数を使用して、添付ファイルをメールで送信したいと考えております。 mail("-----@co.jp",$subject,$msg,$headers);を実行します。 $headersは、追加ヘッダということになっています。 $boundary="-*-*-*-*-*-*-*-*-*-Boundary_".uniqid("b"); とセットし、 $headersには、 $headers=Content-Type:multipart/mixed; $headers.=boundary=$boundary; として、実行します。 送られてきたメールのヘッダの内容を確認すると 「Content-Type」が、 Content-Type:text/plain; となってしまいます。 mail()関数のヘッダの指定方法は、これでいいのでしょうか? 実際のコードは、メッセージ部分などいろいろ書き込んでいます。いろいろ書き換えて実験してみましたが、どうも、この問題をクリアできないと添付ファイルメールを送信することができないようです。 ご存知の方があれば、教えていただきたいです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • ファイルのダウンドードでエラー

    ファイルのダウンドードでエラー あるサイトを参考にファイルをダウンドードするプログラムを組んだのですが、 「リモート サーバーがエラーを返しました: (401) 許可されていません 」 のエラーが出てしまいます。 調べてはいますが、どう直せばいいのか分からない状況です。 どなたか教えてください。 以下ソース(C#です) ------------------------------------------------------------------ System.Net.WebClient wc = new System.Net.WebClient(); string uri = "http://192.168.0.xx/TestService/Excel/pick.xls"; string file = "pick.xls"; wc.DownloadFile(uri,file); wc.Dispose(); ------------------------------------------------------------------ エラー内容 ------------------------------------------------------------------ リモート サーバーがエラーを返しました: (401) 許可されていません 説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。 例外の詳細: System.Net.WebException: リモート サーバーがエラーを返しました: (401) 許可されていません ------------------------------------------------------------------

  • JAVAでソケット通信(クライアント)の際のbind方法

    JAVA初心者です。 アクセス元のIPアドレスで認証をしているサイトがあり、 httpアクセスでそこから定期的に情報を取ってくるようなものを JAVAで作っています。 対象サイトは複数あり、それぞれに許可されているIPアドレスは別になるため、socketを使い、IPアドレスをbindしたいのですがうまくいきません。 ~~前略~~ Socket socket = new Socket(Host, 80); bind(socket,"IPアドレス"); ~~後略~~ もしくは ~~前略~~ Socket socket = new Socket(); bind(socket,"IPアドレス"); ~~後略~~ など、いずれもうまくいきません。なお、クライアントマシンには使用するIPアドレスは全て定義済みです。 また、アクセス元(JAVAが動くPC)のIPアドレスを指定せず デフォルトのままでアクセスする事自体は ~~前略~~ // Hostの内容はyahoo.co.jp等特にアクセスの制限の無いサイトのもの Socket socket = new Socket(Host, 80); ~~後略~~ とすることで接続出来ました。 皆さんの知恵を貸していただければと思います。 アドバイスよろしくお願いいたします。

    • ベストアンサー
    • Java
  • WebBrowserにてCSVを取得したい

    WebBrowserにてCSVを取得したい vb.net(VS2008) にて、WebBrowserを利用して指定のURLからCSVをダウンロードしたいのですが、ダウンロードするダイアログまたはエクセルがWebBrowser内に表示されてしまいます。 単純に、WebBrowserに表示して、DocumentCompleted 時にDocumentとして取得したいのです。 もしくは、ファイル名を予め指定してダウンロードでも問題ありません HttpWebRequest,WebClientによる取得は、 SSLクライアント認証などの公開キーに基づく認証方式が必要なサイトのため、できませんでした。 ダイアログ、エクセルが起動せずに取得出来る方法がありましたら、教えていただけないでしょうか? よろしくお願いします。

  • MyApplicationのUnhandledExceptionいべんとについて

    VB2005で開発しています。 以下のサイトを参考に例外をハンドルしようと思ったのですが、 うまくハンドルされません。 http://dobon.net/vb/dotnet/programing/unhandledexception.html#section4 このイベントはどこで発生しても取得されるものですよね? 少なくともMyApplicationやメインのスレッドで発生した例外はハンドルされるものと思ったのですが。。。 私の使い方が悪いのでしょうか? 簡単に例外を発生させたかったので、以下のような処理を MyApplicationやForm_loadイベントに記載して確認してみました。  IO.File.Open("", IO.FileMode.Open) きっと私の使い方が悪いのだと思うのですが、 どのような使用したらよかったのでしょうか? もしよろしければ、ご教示頂けませんか? お願いいたします。

  • VBで使用できるDLL(SSL通信)をVC++で作成する。

    VBで使用できるDLLをVC++で作成しました。 内容は、SSL転送をWindowsで行うためのDLLです。 DLLではなくexeで作成したときはDOS窓からうまく動いたのですが、 DLLで作成をして、VBから呼んだときにエラーメッセージがでてプログラムは実行されません。 エラーメッセージは、 実行時エラー'53': ファイルが見つかりません:dll-file-name です。 エラーにはいろいろな要素があると思うのですが、 このエラーが出るか出ないかは、関数の中のSSL通信のプログラムを書くと このエラーがでます。 例>SSLeay_add_ssl_algorithms(); SSL通信の記述がなければ正常に実行されるので、この部分だけだと思うの ですが、特別な設定、記述があれば教えてください。 よろしくお願いします。

  • このメッセージの意味と対処法教えてください

    アプリケーションのコンポーネントでハンドルされていない例外が発生しました。続行をクリックすると...終了します。 要求は中止されました。SSL/TLSのセキュリティで保護されているチャネルを作成できませんでした。 というメッセージが出ます。 対処法を教えてください。 ※OKWAVEより補足:「富士通FMV」についての質問です。

  • shuriken2007の設定

    shuriken2007を購入したのですが、設定しても送受信ができません。 「SSL/TSL通信中にエラーが発生しました(-2146893048)→ログインできませんでした」と出ます。 outlook、windowsmail、thunderbirdでも一度もこんなことはなく、いろいろ試して調べたのですが、打つ手がありません。 OS VISTA プロバイダー dion(au one net) ・アカウント情報(受信)の入力 popサーバ 指定通り ユーザー名 指定通り パスワード 指定通り(アスタリスクの字数が一致していないのはいいのですよね?私のパスワードは6字ですが、アスタリスクは常に8字) 受信サーバのポート 110 ※何もいじってないのに、時々勝手に995になります。戻します。 SSLを使用する、STARTTSLを使用しない APOP使用しない ・送信の入力 smtpサーバ 指定通り ポート番号 587 SSLを使用する、STARTTSLを使用しない 送信前認証しない smtp認証する、受信サーバのアカウント情報使う と、この状態で接続確認をすると 「受信サーバの認証に失敗しました。ユーザ名、パスワードを見直してください」と出てしまいます。入力は何十回も確認していますので、誤りはないと確信します。 セキュリティソフトにカスペルスキーを使っているため、そこでも調べて、ジャストシステムの指示通り、ファイアウォ-ル→フィルタリング→設定→追加→でJsvMail.exeをアプリ指定して、UDPとTCPの二つのルールを適用させています。それでもだめでした。 特に、同じトラブルについては噂にもなっていないので、何か見落としているのかもしれません。アドバイスをよろしくお願いいたします。

専門家に質問してみよう