投稿

ラベル(Windows)が付いた投稿を表示しています

hostファイルが原因でIISのアプリケーションプールが停止する

イメージ
これまで検証用のPCでIISが動作しないという現象にしばし出くわしていたが、その原因が判明した。通常利用ではあまり該当しないと思うが、検索しても出てこないので公開しておく。 現象 IISの起動後にWebアクセスすると「503 Service Unavailable」が返ってくる。IISマネージャで見てみるとアプリケーションプールが停止している。またWindowsイベントログには次のような警告が残されている。 イベントID: 5139 ソース: WAS アプリケーション プール 'ASP.NET v4.0' に使われているワーカー プロセス '3336' のプロトコル 'http' に対するリスナー チャネルはリスナー チャネル エラーを報告しました。データ フィールドにはエラー番号が含まれています。 このデータフィールドには 80072AFC ( FC 2A 07 80 )が含まれている。 AppPoolの停止自体はこのエラーが5回連続で発生したためラピッドフェール保護により実行される(直後のエラーログ)。 原因 ネットで検索すると、コンピュータ名に空白を含む場合や実行ユーザの権限の問題などが出てくる。しかし今回の原因はhostファイルだった。 注釈:hostファイル 「C:\Windows\System32\drivers\etc\host」のテキストファイル。ホスト名-IPアドレスの対応を手動で設定する。DNSがないローカル接続の業務システムなんかではたまに利用されている。 このhostファイルに、自身のコンピュータ名に対して実際には無いIPアドレスが設定されていた。この設定を削除したら正常に稼働するようになった。 おそらくコンピュータ名から正引きしたIPアドレスに対してバインドしようとして、ソケットエラーが発生してたのだと推測される。 今回は検証用に流用したPCだったので、過去の設定が残っていてこのような現象が発生した。 以上。

PowerShellで簡易Webサーバを立てる

PowerShellのバッチでHTTPサーバを立ててみる。今日日開発環境ならば何かしらのデバッグサーバがあるが、それらを用意するほどでもない場合などに用いる。 HTTPサーバを起動する手順 方法としては.NetのSystem.Net.HttpListenerを利用する。 HttpListenerオブジェクトを作成して、任意のポートを開く。 GetContextメソッドでリクエストの受信を待機する。 リクエストの内容に合わせてレスポンスを設定する。 2~3をループで繰り返す。 レスポンスにはファイルを読み込んで返すほか、コマンドを実行した結果を返したりすると簡易リモートサーバ的なこともできる。なおシングルスレッドのためリクエストは一つずつ順番に処理される。 ソースコード 以下はバッチファイルのパスをルートディレクトリとしてファイルデータを返すバッチ。 通信ポートを開くには管理者権限が必要なため、powershellが管理者権限でない場合は管理者に昇格して再起動する処理が最初に入っている。 HttpServer.ps1 $isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) if(-not $isAdmin){ Start-Process powershell -Verb runAs $MyInvocation.MyCommand.Path exit } $myDir=(Split-path $MyInvocation.MyCommand.Path -parent) $root = "$myDir" $port = "60080" function Listen{ try{ $listener = New-Object System.Net.HttpListener $listener.Prefixes.Add("http://*:$port/") $liste...

WebページからWindowsアプリを起動する

Windowsでは予めURLスキームを設定しておくことで、Webページ(ブラウザ)からアプリケーションを起動することができる。イントラネット業務アプリの世界で稀に利用されるようなものだったが、近ごろオンラインビデオ会議のクライアントを立ち上げるのによく目にするようになった。 クライアント設定 事前にクライアントとなるWindowsのレジストリに、スキーム名と対応する動作を登録する必要がある。スキーム名を「xxxx」とした場合、レジストリに以下を設定する。 HKEY_CLASSES_ROOT\xxxx 名前 種類 データ (既定) REG_SZ URL:xxx Protocol URL Protocol REG_SZ HKEY_CLASSES_ROOT\xxxx\shell\open\command 名前 種類 データ (既定) REG_SZ example.exe "%1" example.exeの部分に実行したいアプリをコマンドライン形式で記述する。なお起動するアプリは事前にインストールされている必要がある。 Webページからの呼び出し WebページからそのスキームのURLを開かせる。 <a href='xxxx://hogehoge'>start application</a> 開く方法はリンクでもjavascriptでもよい。ただブラウザにブランクページが表示されるので、iframeを設置してその中で開くとよいかもしれない。hogehogeの部分はなんでもよいが、スキームのみ(xxxx://)ではだめなようだ。 URLを開くとブラウザから確認のダイアログが表示される。実行を許可するとレジストリのコマンドが実行される。 情報の受け渡し Webページからアプリへ コマンドライン引数にURLが渡されるので、文字情報であればURLのパスやクエリ式でアプリに情報を渡すことができる。 location.href = "xxxx://start?id=hoge&type=1" ただし通常のURLと同様にURLアンセーフな文字はbase64URLエンコ...