Noobの質問で申し訳ありませんが、コントローラーからServer.MapPathを取得できないようです。 wwwrootの画像フォルダからjsonファイルリストを出力する必要があります。それらはwwwroot/imagesにあります。信頼できるwwwrootパスを取得するにはどうすればよいですか?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Mvc;
using www.Classes;
using System.Web;
namespace www.Controllers
{
[Route("api/[controller]")]
public class ProductsController : Controller
{
[HttpGet]
public IEnumerable<string> Get()
{
FolderScanner scanner = new FolderScanner(Server.MapPath("/"));
return scanner.scan();
}
}
}
Server.MapPathはSystem.Web名前空間から利用できないようです。
プロジェクトはASP.NET 5とdotNET 4.6 Frameworkを使用しています
IHostingEnvironment
プロパティ値にアクセスするには、クラスにApplicationBasePath
を注入する必要があります。 Dependency Injection についてお読みください。依存関係の挿入に成功すると、wwwrootパスが利用可能になります。例えば:
private readonly IHostingEnvironment _appEnvironment;
public ProductsController(IHostingEnvironment appEnvironment)
{
_appEnvironment = appEnvironment;
}
用途:
[HttpGet]
public IEnumerable<string> Get()
{
FolderScanner scanner = new FolderScanner(_appEnvironment.ApplicationBasePath);
return scanner.scan();
}
これは既に回答済みですが、ホスティング環境(IIS ExpressとIIS)によって結果が異なります。 wwwrootパスを取得したい場合、次のアプローチはすべてのホスティング環境でうまく機能するようです( このGitHubの問題を参照 )。
例
private readonly IHostingEnvironment _hostEnvironment;
public ProductsController(IHostingEnvironment hostEnvironment)
{
_hostEnvironment = hostEnvironment;
}
[HttpGet]
public IEnumerable<string> Get()
{
FolderScanner scanner = new FolderScanner(_hostEnvironment.WebRootPath);
return scanner.scan();
}
Azureにデプロイしてこのエラーが発生した場合。私が行ったのはその回避策でした。Azureの環境がローカルIISと異なる理由を理解しようとはしていません。これが私の回避策です:
if (string.IsNullOrWhiteSpace(_environment.WebRootPath))
{
_environment.WebRootPath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "wwwroot");
}
もちろん、次のものが必要です。
private IHostingEnvironment _environment;
public OnboardingController(IHostingEnvironment environment)
{
_environment = environment;
}