Prístup k zdieľaným priečinkom na iných serveroch z aplikácie ASP.NET Core (verzia programu Network Connected Program)

Stránka aktualizovaná :
Dátum vytvorenia strany :

Prostredie overovania prevádzky

Vizuálne štúdio
  • Visual Studio 2022
ASP.NET jadro
  • 8 (Razor Pages, MVC)
Windows Server
  • 2022 (ASP.NET základné systémové požiadavky)
  • 2019 (server nasadenia zdieľaných priečinkov)
IIS
  • 10.0

Prevádzkové prostredie

Netestovali sme ho vo všetkých prípadoch, ale mal by fungovať všeobecne za nasledujúcich podmienok:

Vizuálne štúdio
  • Čokoľvek, čo môže vytvoriť ASP.NET Core projekt
ASP.NET jadro
  • Ľubovoľná verzia (MVC, Razor Pages, API)
Windows Server
  • Windows Server 2008 alebo novší
IIS
  • 7.0 alebo novšia verzia

Predpokladom

  • ASP.NET Základné aplikácie sú určené na spustenie v službe IIS.
  • Keďže na overovanie používa rozhrania API systému Windows, nefunguje v iných systémoch ako Windows.

životné prostredie

Overuje sa v nasledujúcom prostredí.

Účel používania osobných počítačov a serverov
Windows 11 (lokálny) Prostredie pre vývoj programov.
SV2022Test Prostredie, ktoré spúšťa IIS a ASP.NET Core. Prístup k zdieľanému priečinku SV2019Test odtiaľto
SV2019Test Servery so zdieľanými priečinkami

Okrem toho sú rôzne nastavenia nasledujúce.

Hodnota názvu parametra
Používateľské meno programu Access ZdieľanýPoužívateľ
Názov zdieľaného priečinka ZdieľanýPriečinok

Vytvorenie servera zdieľaných priečinkov

Vytvorenie používateľa

Vytvorte používateľa na prístup k spoločnému priečinku. V tomto prípade vytvoríme lokálny účet, ale ak máte čo do činenia so servermi a účtami v doméne, ako je napríklad Active Directory, môžete použiť aj to.

Proces vytvárania používateľa presahuje rámec týchto tipov, takže nebudeme zachádzať do prílišných podrobností.

SharedUser V tomto prípade ho vytvoríme s názvom . Keďže tento používateľ neovláda obrazovku ani nemení nastavenia, heslo nie je možné zmeniť.

Ak ponecháte predvolené nastavenie, môžete sa s týmto používateľom prihlásiť pomocou vzdialenej pracovnej plochy atď., Preto odstráňte zo skupiny Users .

Vytvorenie zdieľaného priečinka

Nezáleží na tom, kde ho vytvoríte. Je to preto, že iné servery sa nestarajú o umiestnenie fyzického priečinka. V takom prípade vytvoríme priečinok s názvom priamo pod SharedFolder jednotkou C a zdieľame ho.

Otvorte vlastnosti a nakonfigurujte nastavenia zdieľania.

Názov zdieľaného priečinka by mal SharedFolder byť . Tento názov bude viditeľný pre ostatné servery. Pridajte SharedUser povolenia.

Everyone Odstráňte existujúci súbor .

Potvrďte povolením "Zmeniť".

Keďže sme pridali iba povolenia, ku ktorým je možné pristupovať zvonku, nastavíme ho interne SharedUser , aby mohol fungovať v tomto priečinku.

Potvrďte povolením "Zmeniť".

Vytvorte súbor na kontrolu operácie. V tomto programe je kódovanie spracované v UFT-8, preto ho prosím uložte do UTF-8.

Je v poriadku, ak máte prístup v programe Prieskumník z \\<サーバー名>\ iného počítača, prihlásiť saSharedUser pomocou a zobraziť súbor.

Vytvorenie programu na čítanie a zápis súborov zo zdieľaného priečinka z aplikácie ASP.NET Core

Operácia Mr./Ms. spočíva v kliknutí na tlačidlo.

  • Načítanie súborov do zdieľaného priečinka a ich zobrazenie na obrazovke
  • Zapísanie nového súboru do zdieľaného priečinka

proces.

Razor Pages a kód MVC sú príkladmi toho, ale program, ktorý pristupuje k zdieľanému priečinku, je rovnaký pre obe. To isté platí pre webové rozhrania API. Ak niečo, malo by to fungovať aj v klientskom programe.

Proces, ktorý sa pripája k sieti počas trvania konkrétneho procesu

Vytvorte nasledujúci kód kdekoľvek v projekte. Názov triedy je SharedFolderAccessor , ale názov je ľubovoľný. SharedFolderAccessor K zdieľanému priečinku máte prístup, kým nevytvoríte Dispose inštanciu súboru . using umožňuje určiť časové obdobie, počas ktorého je prístup k prístupu možný v explicitnom rozsahu.

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">共有フォルダのあるサーバーを「\\&lt;サーバー名&gt;」形式で指定します。</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,
  }
}

Keďže používa rozhrania API Win32 a WNetAddConnection2 WNetCancelConnection2 , funguje iba v prostredí Windows. Zatiaľ mám pripomienku, ale ak sa chcete dozvedieť viac, vyhľadajte si ju na internete. Okrem zdieľaných priečinkov môžete vykonávať aj operácie na prístup k sieťovým zdrojom.

Je ľahko použiteľný a ak napíšete nasledovné, môžete using pristupovať k zdieľanému priečinku počas rozsahu.

using (new SharedFolderAccessor($@"\\{serverName}", credentials))
{
  // この間は共有フォルダにアクセスできる
}

V skutočnosti WNetCancelConnection2 však , pripojenie nie je okamžite odpojené v čase volania , takže using k zdieľanému priečinku máte prístup aj po rozsahu.

Testovací kód pomocou funkcie SharedFolderAccessor

Keďže proces prístupu k zdieľanému priečinku nezávisí od rámca, vytvoríme spoločnú metódu testovania, ktorá číta a zapisuje súbory. Pazor Pages a MVC by sa mali nazývať rovnaké.

Obsah je proces, ktorý zapíše text odovzdaný do argumentu do zdieľaného priečinka, prečíta textový súbor, ktorý sa už v zdieľanom priečinku nachádza, a vráti 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));
    }
  }
}

Žiletkové stránky

V Razor Pages umiestnime tlačidlo do Index.cshtml, klikneme naň, spustíme testovací kód a výsledky zobrazíme na obrazovke. V niektorých prípadoch nemusí byť zdieľaný priečinok prístupný, takže je uzavretý v úlovku pokusu.

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

Podobne v prípade MVC Index.cshtml je tlačidlo umiestnené v , a po kliknutí vyvolá testovací kód zdieľaného priečinka.

Ovládač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>
@* ここまで追加 *@

Potvrdenie prevádzky

Ladenie a overenie, či máte úspešný prístup k zdieľanému priečinku.

Budovanie aplikačného servera

Keďže sme potvrdili, že k zdieľanému priečinku je možné pristupovať spustením programu, ďalší krok nie je potrebný. Ak chcete skontrolovať operáciu na serveri služby IIS, môžete to urobiť podľa krokov uvedených nižšie.

Odtiaľ je to doplnok, takže to nebudem vysvetľovať príliš podrobne, ale hlavne vysvetlím obrázok.

Inštalácia služby IIS

Predvolene ho nainštalujte zo Správcu servera. Nebudem zachádzať do podrobností postupu.

Nie sú potrebné žiadne ďalšie funkcie.

V súčasnosti nie sú potrebné žiadne ďalšie služby IIS.

ASP.NET Inštalácia balíka Core Runtime Hosting

Keďže používame ASP.NET Core 8, musíme zodpovedajúcim spôsobom nainštalovať runtime. Stiahnite si ho z nasledujúcej adresy URL:

Ak chcete spustiť ASP.NET Core v IIS, potrebujete niečo, čo sa nazýva "Hosting Bundle". Stiahnite si "Hosting Bundle" z ASP.NET Core Runtime.

Po stiahnutí ho spustite na serveri.

Podľa pokynov sprievodcu ho nainštalujte.

Publikovanie programu

Výstup programu, ktorý chcete nasadiť do služby IIS ako súboru z programu Visual Studio.

Upravte ho pre Windows.

Po dokončení zverejnite.

Ak kliknete na cieľové umiestnenie, môžete otvoriť priečinok, v ktorom sa nachádza publikovaný súbor.

Nemusíte ich priniesť všetky, ale ak si nie ste istí, môžete si ich zatiaľ vziať všetky. V tomto okamihu stačí skontrolovať, či súbor existuje.

Tvorba a nasadzovanie webových aplikácií

V nástrojoch na správu systému Windows otvorte Správcu internetových informačných služieb (IIS).

Vytvoríme stránku, ale tentoraz použijeme "predvolenú webovú stránku", ktorá je tam od začiatku.

Keď je vybratá možnosť Predvolená webová lokalita, kliknutím na položku Prieskumník otvorte priečinok. Skopírujte zverejnený program tu. Pôvodný súbor môžete odstrániť.

Otvorte stránku pomocou prepojenia IIS a skontrolujte, či sa zobrazí obrazovka. Najprv môžete otvoriť webový prehliadač a priamo zadať adresu URL.

Potvrdenie prevádzky

Kliknutím na tlačidlo overíte, či funguje bez problémov. Vo vyššie uvedenom je prístupný z webového servera, ale keďže ide o webový server, malo by byť možné ho ovládať z iných počítačov.