タグ: ASP.NET MVC5

  • .NET アプリがどのランタイムバージョンで動作しているかを調べる

    現在、稼働している.NETのアプリが、どのバージョンのライタイムで、アプリケーションが動作するようになっているのかを調べてみる。この方法は、.NET5よりも後の.NETアプリについて、調べることができる。

    アプリのフォルダで、下記の名前のファイルがあるかを調べる。[appname]の部分には、そのアプリの名前がついている。

    [appname].runtimeconfig.json

    次のそのJSONファイルを開く。メモ帳などのテキストエディタで開けばよい。

    下のような中身になっているので、「tfm」や「version」の部分を確認し、どの.NETバージョンを利用するようになっているのかを確認する。

    {
      "runtimeOptions": {
        "tfm": "net8.0",
        "includedFrameworks": [
          {
            "name": "Microsoft.NETCore.App",
            "version": "8.0.5"
          },
          {
            "name": "Microsoft.AspNetCore.App",
            "version": "8.0.5"
          }
        ],
        "configProperties": {
          "System.GC.Server": true,
          "System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
          "System.Reflection.NullabilityInfoContext.IsSupported": true,
          "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
        }
      }
    }

    参考: https://learn.microsoft.com/en-us/dotnet/core/runtime-config/

  • IISで .NET5のアプリケーションが動作するように設定する

    Windows Server 2019のIISで .NET5 (ASP.NET core)のアプリケーションが動作するように設定したので、そのメモ。

    設定手順

    1. 下記の .NETのダウンロードページにアクセスする。
    https://dotnet.microsoft.com/download/dotnet

    2. 「.NET 5.0」のリンクをクリックする。

    3. 「ASP.NET Core Runtime 5.0.x」のWindowsの「Hosting Bundle」をクリックする。インストーラーのダウンロードが始まる。「Hosting Bundle」には、IISのサポートが含まれるので、IISで動作させる場合には、これを選択する必要がある。

    4. ダウンロードしたファイル(dotnet-hosting-5.0.9-win.exe)を実行して、インストールする。

    5. IISのサービスを再起動する(Windowsなので、OSごと再起動できるのならば、OS再起動の方が安全)。

    6. IISマネージャーを開く

    7. アプリケーションプールを開いて、「アプリケーションプールの追加」をクリックする。

    8. 「名前」はわかりやすければ、なんでもよい。「.Net CLR バージョン」は「マネージドコードなし」を選択。「マネージド パイプラインモード」は「統合」を選択する。「OK」をクリックして作成する。

    9. ASP.NET coreのアプリを発行し、サーバ上に配置する。

    10. IISマネージャーで、サイトからアプリケーションを追加するWebサイトを選択する。(Webサイトがない場合は追加する)

    11. 右クリックから「アプリケーションの追加」を選択する。

    12. 「エイリアス」を入力し、「物理パス」に発行したアプリケーションのフォルダを選択する。「アプリケーションプール」のところにある「選択」をクリックし、一覧の中から追加したアプリケーションプールの名前を選択する。

    13. 「OK」をクリックして、追加する。

    14. ブラウザでアクセスして、動作を確認する。

    以上で設定は終わり。

  • デプロイしたアプリにアクセスしたら ”HRESULT からの例外:0x801310“ が発生した

    ASP.NET(MVC5)で作成したアプリを変更してデプロイした。デプロイ後、Invoke-WebRequestでアクセスしたところ、アプリケーションエラーが発生した。エラー内容は下記。

    Invoke-WebRequest : '/API' アプリケーションでサーバー エラーが発生しました。
    ファイルまたはアセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicK
    eyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリのマニフェスト定義はア
    センブリ参照に一致しません。 (HRESULT からの例外:0x80131040)
    説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所について
    は、スタック トレースを参照してください。
    例外の詳細: System.IO.FileLoadException: ファイルまたはアセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform,
    Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。見
    つかったアセンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)
    ソース エラー:
    現在の Web 要求の実行中にハンドルされていない例外が生成されました。障害の原因および発生場所に関する情報については、下の
    例外スタック トレースを使って確認できます。
    アセンブリ読み込みトレース: 以下の情報は、アセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1
    .0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' を読み込めなかった原因を調べるのに役立ちます。
    警告: アセンブリ バインドのログ記録がオフにされています。
    アセンブリ バインドのエラー ログを有効にするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) を 1
    に設定してください。
    注意: アセンブリ バインドのエラー ログに関連するパフォーマンス ペナルティがあります。
    この機能をオフにするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] を削除します。
    スタック トレース:
    [FileLoadException: ファイルまたはアセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Cult
    ure=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリの
    マニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)]
       System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly
    , StackCrawlMarkHandle stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName, ObjectHandleOnStack type) +0
       System.RuntimeTypeHandle.GetTypeByName(String name, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly
    , StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean loadTypeFromPartialName) +96
       System.Type.GetType(String typeName) +62
       System.CodeDom.Compiler.CompilerInfo.get_IsCodeDomProviderTypeValid() +15
       System.Web.Compilation.CompilationUtil.GetRecompilationHash(CompilationSection ps) +2406
       System.Web.Configuration.CompilationSection.get_RecompilationHash() +110
       System.Web.Compilation.BuildManager.CheckTopLevelFilesUpToDateInternal(Int64 cachedHash) +551
       System.Web.Compilation.BuildManager.CheckTopLevelFilesUpToDate(Int64 cachedHash) +59
       System.Web.Compilation.BuildManager.ExecutePreAppStart() +155
       System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMap
    PathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception ap
    pDomainCreationException) +746
    [HttpException (0x80004005): ファイルまたはアセンブリ 'Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.
    1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセ
    ンブリのマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)]
       System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +552
       System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +122
       System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +737
    バージョン情報: Microsoft .NET Framework バージョン:4.0.30319; ASP.NET バージョン:4.8.4075.0
    発生場所 行:1 文字:1
    + Invoke-WebRequest http://xxxx:8080/api/xxxxCopy/
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest]、WebExce
        ption
        + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
    

    Visual Studioで開発してテストしていると何も問題がなかった。原因は、Web.configをデプロイしていなかったこと。Visual Studioの環境や.Net Framework 4.8の環境は、毎月更新されていく。その環境でコンパイルしたときに、もともとのWeb.configに記載された情報と新しくコンパイルされたものの情報が異なった。そのために、実行時にエラーになった。解決策としては、新しくコンパイルした方のWeb.configを使うこと。環境に合わせて変更する必要があれば変更する。

  • デバック実行時に「~~~\bin\rosylyn\csc.exe」の一部が見つかりませんと表示される

    人から受けとったASP.NET MVCのプログラムをVisual Studio 2019でデバック実行したところ、下記のエラーが発生した。

    '/' アプリケーションでサーバー エラーが発生しました。
    
    パス 'C:\xxxx\xxxx\xxxx\bin\roslyn\csc.exe' の一部が見つかりませんでした。
    

    調べていったところ、NuGetにある「Microsoft.CodeDom.Providers.DotNetCompilerPlatform」のパッケージのバージョンをアップデートしたところ、この問題が解消され、このエラーは解消された。

    依存関係の問題なので、アップデートではなく、「Microsoft.CodeDom.Providers.DotNetCompilerPlatform」の再インストールでも解決すると思われる。