トップ回答者
ASP.NET MVCのサイトがサーバーで実行できない問題

質問
-
お世話になります。
ASP.NET MVCをサーバーで実行できない問題について、ご相談させていただきます。
まず環境についてから記載します。■開発用PC
- 開発環境:Visual Studio Express 2015 for Web
- OS: Windows 10 Professional
- IIS: IIS 10.0
■サーバー
- サーバー:Windows Server 2012 r2
- IIS: IIS 8.5
- .NET Framework 4.6
■現象
開発用PCでASP.NET MVC(ver. 5.2)のサイトを作成しました。
VS上のIIS Expressでも実行でき、開発用PCのIIS 10.0でも実行できたので、
その後サーバーへアップロードしたところ、以下のエラーになり実行できませんでした。[Win32Exception (0x80004005): アクセスが拒否されました。] [ExternalException (0x80004005): プログラムを実行できません。実行しようとしたコマンドは "D:\Inetpub\MySiteA\bin\roslyn\csc.exe" /shared /keepalive:"10" /noconfig /fullpaths @"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\2bb4a8fc\c728dd0b\lirki4ic.cmdline" です。]
Roslynに関してのエラーのように見えますが、探しても適切な解決方法が見つかりませんでした。
事前にサーバー側で何かインストールが必要なのでしょうか?どなたかおわかりになるようであれば、ご教授おねがいいたします。
よろしくお願いいたします。
回答
-
度々申し訳ありません。
根本的な解決方法らしき情報が見つかりました。
どうも私固有の問題でもなさそうなので同じ症状の方もおられると思い、まとめさせて頂きました。Publish website without roslyn
このスレ主も私と同じような症状だったらしく、
- VS2015にしたら、roslyn\csc.exeのアクセス権の問題が起こった
- VSから「Publish(公開)」したらroslynフォルダーが生成された
- 以前のVSでは同じエラーは現れなかった
等と言っており、それに対してNo.11のベストアンサーが解決策を書いています。
- 自分も同様の問題に遭遇した
- 「新しいWebプロジェクト」を作ると、2つのNuget パッケージがプロジェクトに追加される
- その2つのパッケージを削除すれば問題は解決する。
- その2つのパッケージ↓
・Microsoft.CodeDom.Providers.DotNetCompilerPlatform
・Microsoft.Net.Compilers
操作方法は、VSの「ツール」→「Nuget パッケージマネージャー」→「ソリューションのNugetパッケージの管理」から上記2つを検索して「アンインストール」を実行するだけです。
これにより、先述の<system.codedom>は生成されず、無事にサーバーでも動作するようになります。以上です。
- 回答の候補に設定 SurferOnWww 2016年1月23日 2:05
- 回答としてマーク 星 睦美 2016年1月29日 5:08
すべての返信
-
> 探しても適切な解決方法が見つかりませんでした。
エラーメッセージでググって、英語のサイト(これが重要)まで含めて調べたのでしょうか?
もしまだならやってみましょう。同じ問題に悩んだ人は結構いるようで、いくつかの記事がヒットします。例えば下記:
Precompiling when publishing asp.net MVC site
https://www.reddit.com/r/dotnet/comments/3ont0d/precompiling_when_publishing_aspnet_mvc_site/"System.ComponentModel.Win32Exception: Access is denied"
http://blog.brendanlacanette.com/2015/07/systemcomponentmodelwin32exception.htmlそれで解決できればそれに越したことはないですし、解決できなくてもどの記事を参考にしてどこまでやってみたかを書くと、回答者の方も考える範囲が絞れるので、より回答が得やすくなるのではと思います。
- 編集済み SurferOnWww 2016年1月19日 3:09 参考記事追加
-
ご回答ありがとうございます。
> エラーメッセージでググって、英語のサイト(これが重要)まで含めて調べたのでしょうか?
>はい、実はご指摘のサイトは既に読んだ上で実践していました。書かずに申し訳ありません。
ご指摘のサイトでは、.net framework 4.5.2に落としてビルドした結果動作したという内容でしたが、私の環境で同じようにしても改善されませんでした。念のため、開発済みのサイトでなく、「新しいプロジェクト」から空のASP.NET MVCサイトを作り、トップページだけ作成してみましたが、やはりVS上とローカルIIS上では動き、サーバーでは同様のエラーメッセージにより動作しませんでした。
他に試した記事としては、
と、そこからリンクしている、
Can't Build Asp.net mvc project generated from vstudio 2015 enterprise
がありますが、英語力不足でよく理解できませんでした。
-
質問者さんが挙げた「Basic MVC app not working」や私が挙げた「Precompiling when publishing asp.net MVC site」に書いてあるプリコンパイルは試したのでしょうか?
現象とエラーメッセージから見ると、View をサーバー側でコンパイルする時に、コンパイラ csc.exe にアクセス権がなくてコンパイルできないということが原因のようです。
それが原因であれば開発マシンでプリコンパイルすれば、対症療法かもしれませんが(何故アクセス権がないのか、少なくとも理由を調べるのが望ましいと思いますので)、解決するのではないでしょうか?
-
度々ありがとうございます。
解決したのでご報告致します。> 質問者さんが挙げた「Basic MVC app not working」や私が挙げた「Precompiling when publishing asp.net MVC site」
> に書いてあるプリコンパイルは試したのでしょうか?
>プリコンパイルは当初から設定済みだったため、別の原因を探したところ下記の記事を見つかりました。
Deploying ASP.NET MVC4 App to GoDaddy Compiler issue
既に一度確認済みの記事でしたが見慣れない用語があったため別システムに関わる質問だと思い一度は無視しましたが、追求してみると以下の記事も発見されました。
ホームページ「sorceryforce.net」の実行環境を変更しました
共通する事は「web.config内のsystem.codedomを削除」するというもので、実践したところ解決に至りました。
ただし、これによりコンパイルの設定を変えたためか、web.configの<compilation debug="false">にするとRegisterTemplateBundlesが効かなくなるような挙動になるため、常に「debug="true"」にしています。これについては自分なりに調べてみようかと思います。SurferOnWww様、いつもご回答くださり感謝致します。
WebFormsからMVCへの移行は当初苦労しましたが、おかげさまで一段落できた感があります。 -
度々申し訳ありません。
根本的な解決方法らしき情報が見つかりました。
どうも私固有の問題でもなさそうなので同じ症状の方もおられると思い、まとめさせて頂きました。Publish website without roslyn
このスレ主も私と同じような症状だったらしく、
- VS2015にしたら、roslyn\csc.exeのアクセス権の問題が起こった
- VSから「Publish(公開)」したらroslynフォルダーが生成された
- 以前のVSでは同じエラーは現れなかった
等と言っており、それに対してNo.11のベストアンサーが解決策を書いています。
- 自分も同様の問題に遭遇した
- 「新しいWebプロジェクト」を作ると、2つのNuget パッケージがプロジェクトに追加される
- その2つのパッケージを削除すれば問題は解決する。
- その2つのパッケージ↓
・Microsoft.CodeDom.Providers.DotNetCompilerPlatform
・Microsoft.Net.Compilers
操作方法は、VSの「ツール」→「Nuget パッケージマネージャー」→「ソリューションのNugetパッケージの管理」から上記2つを検索して「アンインストール」を実行するだけです。
これにより、先述の<system.codedom>は生成されず、無事にサーバーでも動作するようになります。以上です。
- 回答の候補に設定 SurferOnWww 2016年1月23日 2:05
- 回答としてマーク 星 睦美 2016年1月29日 5:08
-
情報提供をありがとうございます。参考にされていた「Publish website without roslyn」は以下のようなことだと理解しました。
(1) VS2015 で ASP.NET 4.5.1 の Web アプリのプロジェクトを新規作成。
(2) コンパイラ関係の NuGet が 2 つ自動的にインストールされる。(これが Roslyn ?)
(3) その際、Web アプリの bin フォルダに roslyn というサブフォルダが生成され、その中に csc.exe というコンパイラが配置される。
(4) さらに Web アプリの web.config に <system.codedom> 要素が生成され、サーバーで View をコンパイルするのに上記 (3) のコンパイラを使うよう設定される。
(5) 記事を書いた人のレンタルサーバーでは上記 (3) のコンパイラの実行権限がなく View のコンパイルに失敗する。
(6) NuGet をアンインストールすれば上記 (4) の設定がなくなって上記 (3) のコンパイラを使わない(C:\Windows\Microsoft.NET\Framework\v4.0.30319 フォルダの csc.exe を使う?)ので問題が起きない。
自分が依然として分からないのは:
・プリコンパイルしたのに何故ダメだったのか?
・レンタルサーバーではなさそうな質問者さんのサーバーで権限がないのは何故か?ですが、もし分かったら教えていただけると幸いです。
-
わかりやすくまとめて頂き、感謝致します。問題点がかなり整理されました。
ご指摘についてお答えしたいと思います。
> ・プリコンパイルしたのに何故ダメだったのか?
これについて新たなプロジェクトで試したところ、私の認識不足でした。
プロジェクトの「公開」時に「Precompile during publishing」(何故かこの部分だけ英語表記になっている)をチェックしていたものの、そこから「Configure」を開き「プリコンパイル済みサイトを更新可能にする」にもチェックを入れていました。これがあると実行時にサーバー側でViewのコンパイルをしてしまうのだと思いますが、知らずに設定してしまっていたようです。
チェックを入れない状態で「公開」すると、サーバーでも実行できました。> ・レンタルサーバーではなさそうな質問者さんのサーバーで権限がないのは何故か?
実はアクセス権設定は可能なのですが、会社のサーバーであるためいつでも自由に設定できるわけではないという事情があります。
おそらく当該ディレクトリに対しIIS_USRSに実行権限を与えると出来そうですが、これはすぐにできそうにないため、またの機会に試してみたいと思います。- 回答の候補に設定 SurferOnWww 2016年1月23日 2:05
-
情報提供をありがとうございます。おかげさまで疑問が解けました。
> そこから「Configure」を開き「プリコンパイル済みサイトを更新可能にする」にもチェック
> を入れていました。「プリコンパイル済みサイトを更新可能にする」は以下の記事にある [Allow precompiled site to be updatable] ですね。
Advanced Precompile Settings Dialog Box
https://msdn.microsoft.com/en-us/library/hh475319(v=vs.110).aspx> これがあると実行時にサーバー側でViewのコンパイルをしてしまうのだと思いますが、知らず
> に設定してしまっていたようです。自分は VS2015 を持っていないので想像ですが、デフォルトでチェックが入っているのではないかと思います。(VS2010 の [Web サイトの発行] ダイアログ ボックスではデフォルトでチェックが入っています)
Web アプリケーションプロジェクトでも、サーバーにデプロイ後 .aspx, .ascx のみ(MVC の場合は View のみ)差し替えたいが、その際全体を再コンパイルしたくないということがあると思います。「プリコンパイル済みサイトを更新可能にする」にチェックを入れるということは、.aspx, .ascx ページ(MVC の場合は View)をアセンブリにコンパイルされないように指定し、サーバーでのファイルの差し替えを可能にするということだそうです。
ということは、.aspx, .ascx ページ(MVC の場合は View)はサーバー側でコンパイルを行うということになります。(初回要求のときのみ。コンパイルされたアセンブリは Temporary ASP.NET Files に保存されて次回の要求では再利用されるはずです)
通常それで問題ないはずですが、今回のケースでは運用サーバーには web.config に <system.codedom> 要素で指定されたコンパイラ(bin\roslyn\csc.exe)の実行権限がなく、コンパイルに失敗したということのようです。
> チェックを入れない状態で「公開」すると、サーバーでも実行できました。
その場合はサーバー側でコンパイルは行わないので問題がなくなったということでしょう。
ただし、そうするとサーバーにデプロイした後、.aspx, .ascx のみ(MVC の場合は View のみ)差し替えるということができなくなってしまうと思いますが。(View をちょっとだけ変更しても、開発環境で再コンパイルして再発行することになると思います)
#質問者さんの運用サーバーで bin フォルダに置かれたコンパイラの実行権限がないのは、質問者さんの環境での特殊事情と理解します。
-
> ただし、そうするとサーバーにデプロイした後、.aspx, .ascx のみ(MVC の場合は View のみ)差し替えるということが
> できなくなってしまうと思いますが。(View をちょっとだけ変更しても、開発環境で再コンパイルして再発行することになると思います)
>おっしゃるとおりです。
従来WebFormsで.aspxや.aspx.cs単位の更新をしていた身としては煩わしいですが、(私のように)ディレクトリのアクセス権設定を自由に設定できない場合やレンタルサーバーの方は、毎度発行をする必要があるのだと思います。ただ本番環境であれば、(初回のみとはいえ)一般ユーザーのアクセス時にコンパイルに時間が掛かるのは出来れば避けたいので、Webマスター側の一括発行で済ませられるのは逆にメリットとも考えられます。
ただ現在はまだMVCサイトのページ数が少ない為かさほど時間もかかりませんが、コンテンツが増えた際の発行時間が将来的に心配ではありますが…。いずれroslynのコンパイラが、サイト内(bin\roslyn\xxx.exe)でなく、ASP.NETコンパイラのように「%windir%\microsoft.net\framework\vX.X.XXX\」のように配置されれば解決される気もしますが…何か事情があるのかもしれません。