2013-08-30 19 views
7

私は最近、Azure 2.1 SDKにアップグレードしました。計算エミュレータで実行しているときに私のweb.configの一部に問題が発生しました。私web.configはこれを含んでいますappcmd.exeのロック解除設定がAzureエミュレータで機能しないのはなぜですか?

<location path="api"> 
    <system.webServer> 
    <security> 
     <access sslFlags="Ssl, SslRequireCert, SslNegotiateCert" /> 
    </security> 
    </system.webServer> 
    <system.web> 
    <authorization> 
     <allow users="*" /> 
    </authorization> 
    </system.web> 
</location> 

/api/パスの下のすべてがHTTPSを介してクライアント側の証明書を提供することにより、認証するためにクライアントが必要なので、私はこれを必要とします。

既定では、<access>要素がsystem.webServer/securityの下にある既定でロックされています。あなたが500.19エラーになるだろう、それがなければ

SET APPCMD=%windir%\system32\inetsrv\appcmd.exe 
IF EXIST APPCMD GOTO :INUSUALPLACE 
SET APPCMD="%ProgramFiles%\IIS Express\appcmd.exe" 
:INUSUALPLACE 
%APPCMD% unlock config /section:system.webServer/security/access 

:だから私はいつもこれが含まれているスタートアップタスクを持っていました。最近まで、この起動タスクは常にエラーを防ぎ、SSL設定を有効にしました。

しかし、これはもう機能しません。私が知る限り、これは2.1 SDKに切り替えたときに起こりました。このWebロールの他のすべては途中で機能します。SSLコンフィグレーションの設定が適用される/api/パスのサービスにアクセスしようとするとエラーが発生します。それは500.19です。 (500はもちろん「内部サーバーエラー」ですが、.19は構成エラーであることを示しています)。

この構成セクションのロックを解除しようとする試みはもはや機能していません。私が言うのは、Azureエミュレータが(C:\Users\<user>\AppData\Local\dftmp\Resources\<some random guid>\temp\temp\RoleTempに)作成したapplicationHost.configファイルで、のsecurity要素のDenyを置き換えて手動で編集すると、エラーが表示されなくなり、正常に使用できます。クライアント証明書を必要とするサービス

これは回避策としては使用できません。このapplicationHost.configは、エミュレータでアプリを実行するたびに再生成されます(正確な場所は毎回変更されます)。私はアプリケーションをローカルでデバッグするたびに自動的にこの設定セクションのロックを確実に解除する方法が必要です。それはappcmd.exeのことですが、動作を停止したようです。

Azure SDKがIIS Expressを使用していても、IISのバージョンがappcmd.exeであることが問題になっている可能性があります。私は彼らが別のプログラムかどうか分からないので、スタートアップコマンドの最後にこれを追加しようとしました。

"%ProgramFiles%\IIS Express\appcmd.exe" unlock config /section:system.webServer/security/access 

これは明示的にIIS Expressのコピーを実行します。しかし、それは何の違いもないようです。

誰かが尋ねる前に、起動タスクが確実に実行されています。これは私のEnableClientCerts.cmdappcmd.exeを呼び出すスクリプト)がエラーなしで実行されたことを示し

[00025156:00018324, 2013/08/30, 22:15:03.033, INFO ] Executing Startup Task type=0 rolemodule=(null) cmd="c:\dev\mm\DevInt\src\Mm.Cloud\csx\Debug\roles\Mm.Web\approot\bin\Startup\EnableClientCerts.cmd" 
[00025156:00018324, 2013/08/30, 22:15:03.034, INFO ] Executing "c:\dev\mm\DevInt\src\Mm.Cloud\csx\Debug\roles\Mm.Web\approot\bin\Startup\EnableClientCerts.cmd" . 
[00025156:00018324, 2013/08/30, 22:15:03.221, INFO ] Program "c:\dev\mm\DevInt\src\Mm.Cloud\csx\Debug\roles\Mm.Web\approot\bin\Startup\EnableClientCerts.cmd" exited with 0. Working Directory = c:\dev\mm\DevInt\src\Mm.Cloud\csx\Debug\roles\Mm.Web\approot\bin 

:これらの行をapplicationHost.configと同じフォルダに、私はWaHostBootstrapper.logファイルを参照してください、そして、それは(とりわけ)が含まれています。

appcmd.exeは、どの特定のWebサイトが設定されているのかが分かりません。いくつかあります - 私はこのボックスに適切なIISを持っており、Azureに関連しないIIS Expressサイトも設定されています。正しいターゲットを設定できない可能性はありますか?

また、私はWaHostBootstrapper.logに誤りのこの種のいくつかを参照してください。

[00025156:00018324, 2013/08/30, 22:15:03.033, ERROR] <- WapGetEnvironmentVariable=0x800700cb 

ことが関係していませんか?

設定セクションのロックを解除するスクリプトに何か不足がありますか?

答えて

7

エミュレータが起動タスクを起動すると、すでにAPPCMDという変数が設定されていることがわかります。また、それはそれだけではなく、AppCmd.exeを参照するように設定し、それはまた、右のコンフィギュレーション・ファイルを指すコマンドラインスイッチが含まれています

"C:\Program Files\IIS Express\appcmd.exe" /apphostconfig:"C:\Users\Ian\AppData\Local\dftmp\Resources\1217ef49-a59a-4e18-8ebc-27d06a78cbd5\temp\temp\RoleTemp\applicationHost.config"

ので、起動スクリプトは、ちょうど最初に設定しようとせずに%APPCMD%を使用している場合正しいインスタンスに適用されます。私のスクリプトは、AppCmd.exeがどこにあるかについて独自の判断を下し、IISやIIS Expressのグローバル設定を変更することになり、Azure EmulatorがホストするIISのインスタンスに影響を与えないように思われるため、スクリプトは機能しませんでした。 (私はこれが動作の最近の変化であると推測している可能性があります。これは、Azure SDK 2.1の新しい機能で、非昇格の開発を可能にします)。

私はこれについて心配していることは、この定義済みのAPPCMD変数を記述したドキュメント私は一時的にそれを追加し、Webの役割を走った、そしてそれはすべての環境変数の完全なダンプを提供

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe "gci env: | format-list" > c:\temp\env.log 

を:私は私のスタートアップ・コマンド・スクリプトに以下を追加して、それを発見しました。そのリストを見ると、正しい構成をターゲットにするために必要な情報が含まれているのは、APPCMDの変数だけです。しかし、スタートアップタスクのドキュメントは、AppCmd.exeのIISコピーを直接指すことを推奨しているようです。Use AppCmd.exe to Configure IIS at Startupの記事では、パスをハードコードしています。私はエミュレータで完全なIISの使用を有効にした場合にはうまくいくと思いますが、実際にはそうしたくありません。

このソリューションは動作しますが(スタートアップタスク環境にあるものを考えれば唯一の実行可能なソリューションと思われます)、文書化されていない機能なので緊張します。あなたがこの答えに遭遇した場合は注意してください。信頼できないかもしれません。

+0

変数がクラウド内に存在するのか、エミュレータ内にのみ存在するのか知っていますか? – Vertigo

+0

それは雲の中にあるようです - このスクリプトはエミュレータとクラウドの両方で機能します。しかしそれはそれが文書化されていないので私に関係している。 –

+4

私はこの "前提条件"に終わった:定義されていない場合APPCMD SET APPCMD =%SystemRoot%\ system32 \ inetsrv \ AppCmd.exe – Vertigo

関連する問題