Přístup ke sdíleným složkám na jiných serverech z aplikace ASP.NET Core (verze programu připojeného k síti)
Prostředí pro ověřování provozu
- Visual Studio
-
- Visual Studio 2022
- ASP.NET jádro
-
- 8 (Razor Pages, MVC)
- Windows Server
-
- 2022 (ASP.NET Základní systémové požadavky)
- 2019 (server pro nasazení sdílených složek)
- Služba IIS
-
- 10.0
Provozní prostředí
Netestovali jsme to ve všech případech, ale obecně by to mělo fungovat za následujících podmínek:
- Visual Studio
-
- Cokoli, co může vyvinout projekt ASP.NET Core
- ASP.NET jádro
-
- Libovolná verze (MVC, Razor Pages, API)
- Windows Server
-
- Windows Server 2008 nebo novější
- Služba IIS
-
- 7.0 nebo novější
předpoklad
- Aplikace ASP.NET Core jsou určené ke spuštění ve službě IIS.
- Vzhledem k tomu, že k ověřování používá rozhraní API systému Windows, nefunguje v jiných systémech než Windows.
životní prostředí
Ověřuje se v následujícím prostředí.
Účel použití | počítačů a serverů |
---|---|
Windows 11 (místní) | Prostředí pro vývoj programů. |
Test SV2022 | Prostředí, ve kterém běží služba IIS a ASP.NET Core. Přístup ke sdílené složce SV2019Test odtud |
SV2019Test | Servery se sdílenými složkami |
Kromě toho jsou různá nastavení následující.
Název parametru | Hodnota |
---|---|
Přístupové uživatelské jméno | Sdílený uživatel |
Název sdílené složky | Sdílená_složka |
Vytvoření serveru sdílených složek
Vytvoření uživatele
Vytvořte uživatele pro přístup ke společné složce. V tomto případě vytvoříme místní účet, ale pokud máte co do činění se servery a účty v doméně, jako je Active Directory, můžete použít i to.
Proces vytváření uživatele je nad rámec těchto tipů, takže nebudeme zacházet do přílišných podrobností.
SharedUser
V tomto případě jej vytvoříme s názvem .
Vzhledem k tomu, že tento uživatel neovládá obrazovku ani nemění nastavení, nelze heslo změnit.
Pokud ponecháte výchozí nastavení, můžete se s tímto uživatelem přihlásit pomocí Vzdálené plochy apod., proto je prosím odeberte ze skupiny Users
.
Vytvoření sdílené složky
Nezáleží na tom, kde jej vytvoříte. Je to proto, že ostatní servery se nestarají o umístění fyzické složky.
V tomto případě vytvoříme složku pojmenovanou přímo pod SharedFolder
jednotkou C a budeme ji sdílet.
Otevřete vlastnosti a nakonfigurujte nastavení sdílení.
Název sdílené složky by měl SharedFolder
být . Tento název bude viditelný pro ostatní servery.
Přidejte SharedUser
oprávnění.
Everyone
Odstraňte existující soubor .
Potvrďte pomocí oprávnění "Změnit".
Vzhledem k tomu, že jsme přidali pouze oprávnění, ke kterým lze přistupovat zvenčí, nastavíme je interně SharedUser
tak, aby mohly fungovat v této složce.
Potvrďte pomocí oprávnění "Změnit".
Vytvořte soubor pro kontrolu operace. V tomto programu je kódování zpracováno v UFT-8, proto jej prosím uložte v UTF-8.
Je v pořádku, pokud máte přístup v Průzkumníku z \\<サーバー名>\
jiného počítače, přihlaste seSharedUser
pomocí a zobrazte soubor.
Vytvoření programu pro čtení a zápis souborů ze sdílené složky z aplikace ASP.NET Core
Operace Mr./Ms. spočívá v kliknutí na tlačítko.
- Načtení souborů ve sdílené složce a jejich zobrazení na obrazovce
- Zápis nového souboru do sdílené složky
proces.
Razor Pages a kód MVC jsou příklady, ale program, který přistupuje ke sdílené složce, je pro oba stejný. Totéž platí pro webová rozhraní API. Když už, tak by to mělo fungovat i v klientském programu.
Proces, který se připojuje k síti po dobu trvání určitého procesu
Vytvořte následující kód kdekoli v projektu. Název třídy je SharedFolderAccessor
, ale název je libovolný.
SharedFolderAccessor
Ke sdílené složce můžete přistupovat, dokud nevytvoříte Dispose
instanci .
using
Umožňuje určit časové období, během kterého lze přistupovat k přístupu v explicitním oboru.
using System.ComponentModel;
using System.Net;
using System.Runtime.InteropServices;
<summary>
共有フォルダにユーザー名とパスワードでアクセスするためのクラスです。
using を使用すればそのスコープの間、共有フォルダにアクセスできます。
</summary>
public class SharedFolderAccessor : IDisposable
{
private readonly string _networkName;
<summary>
コンストラクタです。
</summary>
<param name="networkName">共有フォルダのあるサーバーを「\\<サーバー名>」形式で指定します。</param>
<param name="credentials">共有フォルダにアクセスするための資格情報です。</param>
<exception cref="Win32Exception"></exception>
public SharedFolderAccessor(string networkName, NetworkCredential credentials)
{
_networkName = networkName;
// 接続するネットワークの情報を設定
var netResource = new NetResource
{
Scope = ResourceScope.GlobalNetwork,
ResourceType = ResourceType.Disk,
DisplayType = ResourceDisplaytype.Share,
RemoteName = networkName,
};
// ドメインがある場合はドメイン名も指定、ない場合はユーザー名のみ
var userName = string.IsNullOrEmpty(credentials.Domain)
? credentials.UserName
: $@"{credentials.Domain}\{credentials.UserName}";
// 共有フォルダにユーザー名とパスワードで接続
var result = WNetAddConnection2(netResource, credentials.Password, userName, 0);
if (result != 0)
{
throw new Win32Exception(result, $"共有フォルダに接続できませんでした。(エラーコード:{result})");
}
// 正常に接続できれば WNetCancelConnection2 を呼び出すまではプログラムで共有フォルダにアクセス可能
}
~SharedFolderAccessor()
{
// Dispose を呼び忘れたときの保険
WNetCancelConnection2(_networkName, 0, true);
}
public void Dispose()
{
WNetCancelConnection2(_networkName, 0, true);
GC.SuppressFinalize(this); // Dispose を明示的に呼んだ場合はデストラクタの処理は不要
}
<summary>
ネットワーク リソースへの接続を確立し、ローカル デバイスをネットワーク リソースにリダイレクトできます。
</summary>
<param name="netResource">ネットワーク リソース、ローカル デバイス、ネットワーク リソース プロバイダーに関する情報など。</param>
<param name="password">ネットワーク接続の作成に使用するパスワード。</param>
<param name="username">接続を確立するためのユーザー名。</param>
<param name="flags">接続オプションのセット。</param>
<returns></returns>
[DllImport("mpr.dll")]
private static extern int WNetAddConnection2(NetResource netResource, string password, string username, int flags);
<summary>
既存のネットワーク接続を取り消します。
</summary>
<param name="name">リダイレクトされたローカル デバイスまたは切断するリモート ネットワーク リソースの名前。</param>
<param name="flags">接続の種類。</param>
<param name="force">接続に開いているファイルまたはジョブがある場合に切断を行う必要があるかどうか。</param>
<returns></returns>
[DllImport("mpr.dll")]
private static extern int WNetCancelConnection2(string name, int flags, bool force);
<summary>
NETRESOURCE 構造体を定義しています。
</summary>
[StructLayout(LayoutKind.Sequential)]
private class NetResource
{
public ResourceScope Scope;
public ResourceType ResourceType;
public ResourceDisplaytype DisplayType;
public int Usage;
public string LocalName = "";
public string RemoteName = "";
public string Comment = "";
public string Provider = "";
}
<summary>
ネットワークリソースのスコープ。
</summary>
private enum ResourceScope : int
{
<summary>ネットワークリソースへの現在の接続。</summary>
Connected = 1,
<summary>すべてのネットワークリソース。</summary>
GlobalNetwork = 2,
Remembered = 3,
Recent = 4,
<summary>ユーザーの現在および既定のネットワークコンテキストに関連付けられているネットワークリソース。</summary>
Context = 5,
};
<summary>
リソースの種類。
</summary>
private enum ResourceType : int
{
<summary>印刷リソースとディスクリソースの両方のコンテナー、または印刷またはディスク以外のリソースなど。</summary>
Any = 0,
<summary>共有ディスクボリューム。</summary>
Disk = 1,
<summary>共有プリンター。</summary>
Print = 2,
Reserved = 8,
}
<summary>
ユーザーインターフェイスで使用する必要がある表示の種類。
</summary>
private enum ResourceDisplaytype : int
{
<summary>リソースの種類を指定しないネットワークプロバイダーによって使用されます。</summary>
Generic = 0x0,
<summary>サーバーのコレクション。</summary>
Domain = 0x01,
<summary>サーバー。</summary>
Server = 0x02,
<summary>共有ポイント。</summary>
Share = 0x03,
File = 0x04,
Group = 0x05,
<summary>ネットワークプロバイダー。</summary>
Network = 0x06,
Root = 0x07,
Shareadmin = 0x08,
<summary>ディレクトリ。</summary>
Directory = 0x09,
Tree = 0x0a,
Ndscontainer = 0x0b,
}
}
Vzhledem k tomu, že používá rozhraní Win32 API a WNetAddConnection2
WNetCancelConnection2
, funguje pouze v prostředí Windows.
Prozatím mám komentář, ale pokud se chcete dozvědět více, vyhledejte si ho prosím na internetu.
Kromě sdílených složek můžete také provádět operace pro přístup k síťovým prostředkům.
Snadno se používá, a pokud napíšete následující, budete using
mít přístup ke sdílené složce během oboru.
using (new SharedFolderAccessor($@"\\{serverName}", credentials))
{
// この間は共有フォルダにアクセスできる
}
Ve skutečnosti WNetCancelConnection2
však není připojení okamžitě odpojeno v okamžiku volání, takže using
ke sdílené složce můžete přistupovat i po rozsahu.
Testování kódu pomocí SharedFolderAccessor
Vzhledem k tomu, že proces přístupu ke sdílené složce nezávisí na rozhraní, vytváříme společnou metodu testování, která čte a zapisuje soubory. Pazor Pages a MVC by se měly nazývat stejně.
Obsah je proces, který zapíše text předaný argumentu do sdílené složky, přečte textový soubor, který je již ve sdílené složce, a vrátí text.
using System.Net;
public static class Util
{
public static string ReadAndWrite(string text)
{
var serverName = "ServerName";
var folderName = "SharedFolder";
var inputFileName = "Input.txt";
var outputFileName = "Output.txt";
var username = "SharedUser";
var password = "password";
var credentials = new NetworkCredential(username, password);
using (new SharedFolderAccessor($@"\\{serverName}", credentials))
{
// ファイルの書き出し
System.IO.File.WriteAllText(Path.Combine($@"\\{serverName}\{folderName}", outputFileName), text);
// ファイルの読み込み
return System.IO.File.ReadAllText(Path.Combine($@"\\{serverName}\{folderName}", inputFileName));
}
}
}
Razor Stránky
V Razor Pages umístíme tlačítko do souboru Index.cshtml, klikneme na něj, spustíme testovací kód a zobrazíme výsledky na obrazovce. V některých případech nemusí být sdílená složka přístupná, takže je uzavřena v try-catch.
Index.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace SharedFolderAccessRazorPages.Pages
{
public class IndexModel : PageModel
{
private readonly ILogger<IndexModel> _logger;
public string Message { get; set; } = "";
public IndexModel(ILogger<IndexModel> logger)
{
_logger = logger;
}
public void OnPost()
{
try
{
Message = Util.ReadAndWrite($"プログラムからの書き込み ({DateTime.Now})");
}
catch (Exception ex)
{
Message = ex.ToString();
}
}
}
}
Index.cshtml
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
@* ここから追加 *@
<form method="post">
<button type="submit">サブミット</button>
</form>
<div>
@Model.Message
</div>
@* ここまで追加 *@
MVC
Podobně v případě MVC Index.cshtml
je tlačítko umístěno do , a když se na něj klikne, zavolá testovací kód sdílené složky.
Ovladače/HomeController.cs
// 省略
namespace SharedFolderAccessMvc.Controllers
{
public class HomeController : Controller
{
// 省略
public IActionResult Index()
{
return View();
}
// ここから追加
[HttpPost]
public IActionResult Index(string dummy)
{
try
{
ViewData["Message"] = Util.ReadAndWrite($"プログラムからの書き込み ({DateTime.Now})");
}
catch (Exception ex)
{
ViewData["Message"] = ex.ToString();
}
return View();
}
// ここまで追加
public IActionResult Privacy()
{
return View();
}
// 省略
}
}
Index.cshtml
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">Welcome</h1>
<p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>
@* ここから追加 *@
<form method="post">
<button type="submit">サブミット</button>
</form>
<div>
@ViewData["Message"]
</div>
@* ここまで追加 *@
Potvrzení o provozu
Odlaďte a ověřte, zda máte úspěšný přístup ke sdílené složce.
Vytvoření aplikačního serveru
Vzhledem k tomu, že jsme potvrdili, že ke sdílené složce lze přistupovat spuštěním programu, je další krok zbytečný. Pokud chcete zkontrolovat operaci na serveru IIS, můžete to provést podle následujících kroků.
Odtud je to doplněk, takže to nebudu vysvětlovat příliš podrobně, ale vysvětlím hlavně obrázek.
Instalace služby IIS
Ve výchozím nastavení jej nainstalujte ze Správce serveru. Nebudu zabíhat do podrobností postupu.
Nejsou vyžadovány žádné další funkce.
V tuto chvíli nejsou vyžadovány žádné další služby služby IIS.
Instalace sady hostování modulu runtime ASP.NET Core
Vzhledem k tomu, že používáme ASP.NET Core 8, musíme modul runtime odpovídajícím způsobem nainstalovat. Stáhněte si jej z následující adresy URL:
Aby bylo možné spustit ASP.NET Core ve službě IIS, potřebujete něco, co se nazývá "Hosting Bundle". Stáhněte si "Hosting Bundle" z modulu runtime ASP.NET Core.
Po stažení jej spusťte na serveru.
Postupujte podle pokynů průvodce a nainstalujte jej.
Publikování programu
Výstupem programu, který chcete nasadit do služby IIS, jako souboru ze sady Visual Studio.
Upravte jej pro Windows.
Až budete hotovi, publikujte.
Pokud kliknete na cílové umístění, můžete otevřít složku, ve které se nachází publikovaný soubor.
Nemusíte je přivézt všechny, ale pokud si nejste jisti, můžete si je prozatím vzít všechny. V tomto okamžiku se vše, co musíte udělat, je ujistit se, že soubor existuje.
Vytváření a nasazování webových aplikací
V Nástrojích pro správu systému Windows otevřete Správce Internetové informační služby (IIS).
Vytvoříme web, ale tentokrát použijeme "Výchozí web", který je tam od začátku.
Vyberte možnost Výchozí web a kliknutím na Průzkumníka složku otevřete. Zkopírujte publikovaný program zde. Původní soubor můžete odstranit.
Otevřete stránku z odkazu IIS a podívejte se, zda se zobrazí obrazovka. Nejprve můžete otevřít webový prohlížeč a zadat adresu URL přímo.
Potvrzení o provozu
Kliknutím na tlačítko ověřte, že funguje bez problémů. Ve výše uvedeném případě se k němu přistupuje z webového serveru, ale protože se jedná o webový server, mělo by být možné jej ovládat z jiných počítačů.