🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

解決済

3回答

5813閲覧

ASP.NET CoreアプリケーションがLinuxサーバーで動作しない

Fukasawa

総合スコア15

.NET Core

.NET Coreは、マネージソフトウェアフレームワークでオープンソースで実装されています。クロスプラットフォームを前提に考えられており、Windows/Mac/Linuxで動くアプリケーションを作成することが可能です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2019/12/25 07:16

編集2019/12/25 07:23

前提・実現したいこと

ASP.NET Core で作成したWebアプリケーションをLinuxサーバ上で動作させたいです。

下記チュートリアルに基づき、サンプルWebアプリケーションを作成しました。

チュートリアル: ASP.NET Core で Razor ページ Web アプリを作成する

Windows上(ローカル環境)では問題なく、動作しましたが、

それをLinux(Raspberry Pi)で動作させたところ、途中でクラッシュしてしまいます。

解決方法を教えていただけますでしょうか。

発生している問題・エラーメッセージ

チュートリアルに基づき、開発したWindowsのローカル環境下では問題なく動作します。

それをLinuxへコピーして、Linuxのローカル環境下で実行したところ、Topページ(localhost:5000)では問題ないのですが、データベースアクセスをするページに移動すると、エラーメッセージが出てしまいます。

Topページ(localhost:5000)
イメージ説明

Errorページ(localhost:5000/Movies)
イメージ説明

Errorメッセージの抜粋

An unhandled exception occurred while processing the request. PlatformNotSupportedException: LocalDB is not supported on this platform. Microsoft.Data.SqlClient.SNI.LocalDB.GetLocalDBConnectionString(string localDbInstance) PlatformNotSupportedException: LocalDB is not supported on this platform. Microsoft.Data.SqlClient.SNI.LocalDB.GetLocalDBConnectionString(string localDbInstance) ~~ RazorPagesMovie.IndexModel.OnGetAsync() in G:~~\RazorPagesMovie\Pages\Movies\Index.cshtml.cs ~~

エラーメッセージに書いてあるIndex.cshtml.csが以下です。

c#

1namespace RazorPagesMovie 2{ 3 public class IndexModel : PageModel 4 { 5 private readonly RazorPagesMovie.Data.RazorPagesMovieContext _context; 6 7 public IndexModel(RazorPagesMovie.Data.RazorPagesMovieContext context) 8 { 9 _context = context; 10 } 11 12 public IList<Movie> Movie { get; set; } 13 14 [BindProperty(SupportsGet = true)] 15 public string SearchString { get; set; } 16 17 public SelectList Genres { get; set; } 18 19 [BindProperty(SupportsGet = true)] 20 public string MovieGenre { get; set; } 21 22 public async Task OnGetAsync() 23 { 24 IQueryable<string> genreQuery = from m in _context.Movie 25 orderby m.Genre 26 select m.Genre; 27 28 var movies = from m in _context.Movie 29 select m; 30 31 if (!string.IsNullOrEmpty(SearchString)) 32 { 33 movies = movies 34 .Where(s => s.Title.Contains(SearchString)); 35 } 36 37 if (!string.IsNullOrEmpty(MovieGenre)) 38 { 39 movies = movies 40 .Where(x => x.Genre == MovieGenre); 41 } 42 43 Genres = new SelectList(await genreQuery.Distinct().ToListAsync()); 44 Movie = await movies.ToListAsync(); 45 } 46 } 47}

また、そもそもアプリケーションの起動時にデータベースにSeedDataを生成しているのですが、それが原因だと思われるエラーメッセージもターミナルには表示されています。

そもそもLinuxにSQLServerがインストールされていない(できない?)ので、それが原因かもしれません。
nginxがその代わりになるのかと思っていたのですが、違うのでしょうか?

試したこと

Nginx 搭載の Linux で ASP.NET Core をホストする

上記ページに基づいて、以下のことをしました。

  • UseForwardedHeadersの追加

  • VisualStudioでの発行(FolderProfile)

  • 発行したアプリケーションディレクトリをLinux内の/var/www/以下にコピー

  • Linuxへのnginxのインストール、起動

  • LinuxへのASP.NET Coreのインストール

  • Linux上での発行したアプリケーションを起動するサービス構成ファイルの作成

  • エラーメッセージを詳しくするため、サービス構成ファイル内のASPNETCORE_ENVIRONMENT=ProductionASPNETCORE_ENVIRONMENT=Developmentに変更

補足情報(FW/ツールのバージョンなど)

開発環境

Windows 10 1903

Visual Studio 2019 ver. 16.4.0

.NET Core 3.1

実行環境

Raspberry Pi 3 Model B V1.2

Raspbian GNU/Linux 10 \n \l
Microsoft.AspNetCore.App 3.1.0 [/home/pi/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 3.1.0 [/home/pi/dotnet/shared/Microsoft.NETCore.App]

筆者のレベル

C#を用いたデスクトップアプリケーションの開発経験(WPF)はあります。
C#言語自体はおおよそ理解しているつもりです。
WebアプリケーションはC#も含めて、始めてです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

まず、開発環境で使っていた LocalDB は起動するアカウントにユーザープロファイルが必要で、運用環境では例え Windows Server の IIS でもデフォルトの設定では動きません。そもそも LocalDB を運用環境の Web アプリで使おうと考えること自体が間違ってますが。

運用環境で Entity Framework Code First の機能を利用してサーバーに DB を作成してそれを利用することを考えているようですが、それも間違いです。

運用環境ではサーバー側に SQL Server, MySQL, Oracle などの DB サーバーが存在して、それに既存の DB があって、それにアクセスすることになります。

ただ、DB サーバーが存在して既存の DB があっても、それにアクセスして質問のコードのあったような Linq to Entities で操作できるかは別問題です。(SQL Server は大丈夫でしょうがその他はどうか?)

.NET Framework ベースならかなりのところまでサポートされているようですが Core ということになると SQL Server 以外がサポートされているか、サポートされているとしてもどのように実装できるかなどいろいろありそうで、よく調べて対応する必要があると思います。

投稿2019/12/25 09:06

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Fukasawa

2019/12/25 09:58

回答ありがとうございます。 LocalDBでやること自体が間違いということですね。 ということは、運用環境では先にデータベースを構築して、それに対するアクセスキー?などを指定したアプリケーションを作成して起動する必要がある、ということでしょうか? またデータベースの選定にあたってはLinq to Entitiesとの相性が重要との情報もありがとうございます。
退会済みユーザー

退会済みユーザー

2019/12/25 11:29

アクセスキーって何ですか?
Fukasawa

2019/12/26 01:01

> アクセスキーって何ですか? すいません、データベースを扱うこと自体が始めてなので適当な用語を使ってしまいました。 すでにあるデータベースにアプリケーションがアクセスするための権限、ぐらいの意味です。
guest

0

エラーを見る限りだと、LocalDB(SQLServer)は、サポートされていません。LinuxでSQLServerを使用したい場合は、SQL Server on Linuxを使用してみてください。
https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-setup?view=sql-server-ver15

インストール後にインスタンスへの接続文字列を変更すれば上記のエラーは解決すると思います。

投稿2019/12/25 08:27

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Fukasawa

2019/12/25 09:53

回答ありがとうございます。 いただいた情報を元にSQLServerをインストールしてみましたが、失敗しました。 SQLServerは使用しているOS(Raspbian)に対応していないようです。 また*少なくとも*2GBのメモリが要求仕様ですが、Raspberry Piのメモリは1GBしかないので、この点でも厳しいようです。
退会済みユーザー

退会済みユーザー

2019/12/26 01:48

すみません、Raspbian の情報を見落としていました。 目的がASP.NET CoreアプリケーションがLinuxサーバーで動作させることで、実行環境のRaspberry、Raspbianが必須条件でなければ、 以下の環境で試すのを検討してみてはいかがでしょうか。 クライアントOSがWindows10ということですので、Hyper-VにUbuntuインストール、もしくはWSL(Ubuntu)。
Fukasawa

2019/12/26 09:25

特にRaspberryにこだわっているわけではないですが、小型のLinuxボードで動かしたいと考えています。 そこで名前からして軽そうなSQLiteを試してみます。
guest

0

運用環境では先にデータベースを構築して、それに対するアクセスキー?などを指定したアプリケーションを作成して起動する必要がある、ということでしょうか?

Windows Server 用の SQL Server を例に言うと、

(1) サーバーに SQL Server をインストールし、

(2) 開発マシンに EF Code First の機能で生成された DB ファイル(質問者さんのユーザーフォルダ直下に .mdf, .ldf という拡張子のファイルができていると思います)をサーバーの Data ファルダにコピーし、

(3) それを SQL Server の既定のインスタンス(または名前付きインスタンス)にアタッチし、

(4) Web アプリがアクセスするアカウントが SQL Server の認証・承認を通るように設定し、

(5) Web アプリに設定されている接続文字列をインストールした SQL Server に接続できるよう書き換える。

・・・と言う作業が必要になります。

投稿2019/12/26 02:04

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Fukasawa

2019/12/26 09:27

回答ありがとうございます。 他のコメントにも書きましたが、SQLServerは今の運用環境では使えなそうなので、 名前からして軽そうなSQLiteを試してみます。
退会済みユーザー

退会済みユーザー

2019/12/26 09:59

SQLite は Web アプリでは使えるものではないはずです。試験的なものならそれもアリかもしれませんが。
Fukasawa

2019/12/26 11:26

> SQLite は Web アプリでは使えるものではないはずです これの理由としては、同時アクセスやセキュリティの問題でしょうか? まずは作りたいWebアプリケーションの概念実証として数人でLAN内で使ってみようと考えています。
退会済みユーザー

退会済みユーザー

2019/12/26 14:30 編集

ファイルベースだからです。たとえ試験的なものでも、最初からきちんとやった方がよさそうな気がします。do it right the first time という言葉もありますし。そもそも、Core で DB を利用した web アプリで、しかも Linux で、さらに SQL Server 以外とか、DB 初心者が茨の道を歩んでいるような気がします。
Fukasawa

2019/12/27 03:05

> Core で DB を利用した web アプリで、しかも Linux で、さらに SQL Server 以外とか、DB 初心者が茨の道 そうだったんですね。DBといえばLinuxで動くものだと思っていました。 となると、Windowsサーバーのハードを運用環境に配置するのは難しいので、 LAN内で使うのは諦めて、Azureなどにした方が初心者にはいいのでしょうか?
退会済みユーザー

退会済みユーザー

2019/12/27 04:57 編集

> Azureなどにした方が初心者にはいいのでしょうか? それもまたハードルが高そうな気がします。「SQLite は Web アプリでは使えるものではないはずです」と言いましたけど、それはちょっと言いすぎで、SQLite のサイトは SQLite をデーターベースに使っているそうです。「概念実証として数人でLAN内で使ってみよう」という状況ですと SQLite で進めてみるというのも十分アリかもしれません。 ただ、ASP.NET Web アプリはワーカープロセスが要求を受けるたびスレッドプールからスレッドを取得して処理するという典型的マルチスレッドアプリですので(Linux で運用する場合は分かりませんが)、SQLite にそのあたりの配慮がされているかどうかが懸念されるところではありますが。(Access はその理由で非推奨になっています)
Fukasawa

2019/12/27 09:15

なるほど、デスクトップアプリに比べるとWebアプリはバックエンド・フロントエンド・DBなど組み合わせが色々あって難しいですね。 ASP.NET Web アプリが単一ユーザーで使用した場合でもマルチスレッドなのは知りませんでした。 SQLiteはサービスをスケールした場合ネックになりそうですね。 とりあえずSQLiteに変更して、Linux内でブラウザから動作することは確認できました。 まだ、サーバーとして他のPCからアクセスすることはできていませんが、表題の問題は解決済としたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問