Más kiszolgálókon lévő megosztott mappák elérése ASP.NET Core alkalmazásból (Network Connected Program verzió)

Oldal frissítve :
Oldal létrehozásának dátuma :

Művelet-ellenőrzési környezet

Visual Studio
  • Visual Studio 2022
ASP.NET mag
  • 8 (Borotvaoldalak, MVC)
Windows Server
  • 2022 (ASP.NET alapvető rendszerkövetelmények)
  • 2019 (megosztott mappa központi telepítési kiszolgálója)
IIS
  • 10.0

Működési környezet

Nem teszteltük minden esetben, de általában működnie kell a következő feltételek mellett:

Visual Studio
  • Bármi, ami fejleszthet egy ASP.NET Core projektet
ASP.NET mag
  • Bármely verzió (MVC, Razor Pages, API)
Windows Server
  • Windows Server 2008 vagy újabb
IIS
  • 7.0 vagy újabb

előfeltétel

  • ASP.NET Az alapvető alkalmazások az IIS szolgáltatásban való futtatásra szolgálnak.
  • Mivel Windows API-kat használ a hitelesítéshez, nem működik nem Windows rendszeren.

környezet

Ellenőrzése a következő környezetben történik.

A
PC-k és szerverek használatának célja
Windows 11 (helyi) Környezet a programok fejlesztéséhez.
SV2022Teszt Az IIS-t és a ASP.NET Core-t futtató környezet. Az SV2019Test megosztott mappa elérése innen
SV2019Teszt Megosztott mappákkal rendelkező kiszolgálók

Ezenkívül a különböző beállítások a következők.

Paraméternév értéke
Hozzáférési felhasználónév Megosztott felhasználó
Megosztott mappa neve Megosztott mappa

Megosztott mappakiszolgáló létrehozása

Felhasználó létrehozása

Hozzon létre egy felhasználót a közös mappa eléréséhez. Ebben az esetben létrehozunk egy helyi fiókot, de ha olyan tartományban lévő kiszolgálókkal és fiókokkal foglalkozik, mint az Active Directory, akkor azt is használhatja.

A felhasználó létrehozásának folyamata túlmutat ezeknek a tippeknek a hatókörén, ezért nem megyünk bele túl sok részletbe.

SharedUser Ebben az esetben a névvel hozzuk létre. Mivel ez a felhasználó nem működteti a képernyőt, és nem módosítja a beállításokat, a jelszó nem módosítható.

Ha elhagyja az alapértelmezett értéket, bejelentkezhet ezzel a felhasználóval a Távoli asztal stb. segítségével, ezért kérjük, távolítsa el a csoportból Users .

Megosztott mappa létrehozása

Nem számít, hol hozod létre. Ennek az az oka, hogy más kiszolgálók nem törődnek a fizikai mappa helyével. Ebben az esetben létrehozunk egy mappát, amelyet közvetlenül a C meghajtó alatt SharedFolder nevezünk el, és megosztjuk azt.

Nyissa meg a tulajdonságokat, és konfigurálja a megosztási beállításokat.

A megosztott mappa SharedFolder nevének . Ez a név látható lesz a többi kiszolgáló számára. Adja hozzá SharedUser az engedélyeket.

Everyone Törölje a meglévő .

Erősítse meg a "Módosítás" engedéllyel.

Mivel csak olyan engedélyeket adtunk hozzá, amelyek kívülről érhetők el, belsőleg SharedUser állítjuk be, hogy ebben a mappában működhessen.

Erősítse meg a "Módosítás" engedéllyel.

Hozzon létre egy fájlt a művelet ellenőrzéséhez. Ebben a programban a kódolás UFT-8-ban kerül feldolgozásra, ezért kérjük, mentse UTF-8-ban.

Rendben van, ha egy másik számítógépről elérheti az Intézőt \\<サーバー名>\ , bejelentkezhetSharedUser a segítségével, és megtekintheti a fájlt.

Program létrehozása megosztott mappában lévő fájlok olvasásához és írásához ASP.NET Core-alkalmazásból

A Mr./Ms. művelet a gombra kattintás.

  • Fájlok betöltése megosztott mappába és megjelenítése a képernyőn
  • Új fájl írása megosztott mappába

folyamat.

A Razor Pages és az MVC kód példák erre, de a megosztott mappához hozzáférő program mindkettő esetében azonos. Ugyanez igaz a webes API-kra is. Ha valami, akkor az ügyfélprogramban is működnie kell.

Olyan folyamat, amely egy adott folyamat időtartama alatt csatlakozik a hálózathoz

Hozza létre a következő kódot bárhol a projektben. Az osztály neve SharedFolderAccessor , de a név tetszőleges. SharedFolderAccessor A megosztott mappát addig érheti el, amíg létre nem hozza Dispose a példányát. using Lehetővé teszi annak az időtartamnak a megadását, amely alatt a hozzáférés explicit hatókörben elérhető.

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,
  }
}

Mivel a Win32 API-kat és WNetAddConnection2 WNetCancelConnection2 , csak Windows környezetben működik. Egyelőre van egy megjegyzésem, de ha többet szeretne tudni, kérjük, keresse meg az interneten. A megosztott mappák mellett a hálózati erőforrások eléréséhez is végezhet műveleteket.

Könnyen használható, és ha a következőket írja, using hozzáférhet a megosztott mappához a hatókör alatt.

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

A valóságban WNetCancelConnection2 azonban , a kapcsolat nem szakad meg azonnal a hívás idején , így using a hatókör után is elérheti a megosztott mappát.

Kód tesztelése a SharedFolderAccessor használatával

Mivel a megosztott mappa elérésének folyamata nem függ a keretrendszertől, létrehozunk egy közös módszert a fájlok olvasására és írására szolgáló tesztelésre. A Pazor Pages-t és az MVC-t azonosnak kell nevezni.

A tartalom egy olyan folyamat, amely az argumentumnak átadott szöveget a megosztott mappába írja, beolvassa a megosztott mappában lévő szövegfájlt, és visszaadja a szöveget.

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));
    }
  }
}

Borotva oldalak

A Razor Pages-ben elhelyezünk egy gombot az Index.cshtml fájlban, rákattintunk, futtatjuk a tesztkódot, és megjelenítjük az eredményeket a képernyőn. Bizonyos esetekben előfordulhat, hogy a megosztott mappa nem érhető el, ezért egy próbálkozási fogásba van zárva.

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

Hasonlóképpen, az MVC Index.cshtml esetében egy gomb kerül elhelyezésre , és ha rákattint, meghívja a megosztott mappa tesztkódját.

Vezérlők/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>
@* ここまで追加 *@

A működés megerősítése

Hibakeresés és annak ellenőrzése, hogy sikeresen hozzáfér-e a megosztott mappához.

Alkalmazáskiszolgáló létrehozása

Mivel megerősítettük, hogy a megosztott mappa elérhető a program futtatásával, a következő lépés szükségtelen. Ha ellenőrizni szeretné a műveletet az IIS-kiszolgálón, kövesse az alábbi lépéseket.

Innentől kezdve ez egy kiegészítő, ezért nem magyarázom el túl részletesen, hanem főleg a képet magyarázom.

Az IIS telepítése

Telepítse alapértelmezés szerint a Kiszolgálókezelőből. Nem megyek bele az eljárás részleteibe.

Nincs szükség további funkciókra.

Jelenleg nincs szükség további IIS-szolgáltatásokra.

ASP.NET Core Runtime tárhelycsomag telepítése

Mivel ASP.NET Core 8-at használunk, ennek megfelelően kell telepítenünk a futtatókörnyezetet. Töltse le a következő URL-címről:

A ASP.NET Core futtatásához az IIS-ben szüksége van valamire, amit "Hosting Bundle" -nek hívnak. Töltse le a "tárhelycsomagot" a ASP.NET Core futtatókörnyezetből.

A letöltés után futtassa a szerveren.

A telepítéshez kövesse a varázslót.

A program közzététele

Kimenetként adja ki az IIS-re telepíteni kívánt programot fájlként a Visual Studióból.

Módosítsa a Windows rendszerhez.

Közzététel, ha végzett.

Ha a célhelyre kattint, megnyithatja azt a mappát, ahol a közzétett fájl található.

Nem kell mindet magával hoznia, de ha nem biztos benne, egyelőre mindet elviheti. Ezen a ponton mindössze annyit kell tennie, hogy megbizonyosodik arról, hogy a fájl létezik.

Webalkalmazások létrehozása és telepítése

A Windows felügyeleti eszközök közül nyissa meg az Internet Information Services (IIS) kezelőjét.

Létrehozunk egy webhelyet, de ezúttal az "Alapértelmezett webhelyet" fogjuk használni, amely a kezdetektől fogva ott van.

Jelölje be az Alapértelmezett webhely jelölőnégyzetet, és kattintson az Intéző gombra a mappa megnyitásához. Másolja ide a közzétett programot. Törölheti az eredeti fájlt.

Nyissa meg a lapot az IIS hivatkozásból, és ellenőrizze, hogy megjelenik-e a képernyő. Először megnyithat egy webböngészőt, és közvetlenül megadhatja az URL-címet.

A működés megerősítése

Kattintson a gombra annak ellenőrzéséhez, hogy problémamentesen működik-e. A fentiekben a webszerveren belülről érhető el, de mivel webszerverről van szó, lehetővé kell tenni más számítógépekről történő működtetését.