Mengakses folder kongsian pada pelayan lain daripada aplikasi Teras ASP.NET (versi Program Terhubung Rangkaian)

Laman dikemaskini :
Tarikh penciptaan halaman :

Persekitaran pengesahan operasi

Visual Studio
  • Visual Studio 2022
ASP.NET Teras
  • 8 (Halaman Pisau Cukur, MVC)
Pelayan Windows
  • 2022 (Keperluan Sistem Teras ASP.NET)
  • 2019 (Pelayan Penggunaan Folder Kongsian)
IIS
  • 10.0

Persekitaran operasi

Kami belum mengujinya dalam semua kes, tetapi ia harus berfungsi secara amnya di bawah syarat-syarat berikut:

Visual Studio
  • Apa sahaja yang boleh membangunkan projek Teras ASP.NET
ASP.NET Teras
  • Sebarang versi (MVC, Halaman Cukur, API)
Pelayan Windows
  • Windows Server 2008 atau lebih baru
IIS
  • 7.0 atau lebih baru

prasyarat

  • ASP.NET Aplikasi teras bertujuan untuk dijalankan di IIS.
  • Oleh kerana ia menggunakan API Windows untuk pengesahan, ia tidak berfungsi pada bukan Windows.

Persekitaran

Ia disahkan dalam persekitaran berikut.

Tujuan penggunaan PC dan pelayan
Windows 11 (Tempatan) Persekitaran untuk membangunkan program.
SV2022Test Persekitaran yang menjalankan IIS dan ASP.NET Core. Akses folder kongsian SV2019Test dari sini
SV2019Test Pelayan dengan folder kongsian

Di samping itu, pelbagai tetapan adalah seperti berikut.

Nilai Nama Parameter
Akses Nama Pengguna Pengguna Dikongsi
Nama Folder Kongsi Folder Kongsian

Membina pelayan folder kongsian

Buat pengguna

Cipta pengguna untuk mengakses folder umum. Dalam kes ini, kami akan membuat akaun tempatan, tetapi jika anda berurusan dengan pelayan dan akaun dalam domain seperti Active Directory, anda juga boleh menggunakannya.

Proses membuat pengguna adalah di luar skop petua ini, jadi kami tidak akan terlalu terperinci.

SharedUser Dalam kes ini, kami akan menciptanya dengan nama . Oleh kerana pengguna ini tidak mengendalikan skrin atau menukar tetapan, kata laluan tidak boleh diubah.

Jika anda meninggalkan lalai, anda boleh log masuk dengan pengguna ini dengan Desktop Jauh, dan lain-lain, jadi sila alih keluar dari kumpulan Users .

Mencipta Folder Kongsian

Tidak kira di mana anda menciptanya. Ini kerana pelayan lain tidak peduli dengan lokasi folder fizikal. Dalam kes ini, kami akan mencipta folder yang dinamakan terus di bawah SharedFolder pemacu C dan berkongsinya.

Buka sifat dan konfigurasikan seting perkongsian.

Nama folder kongsian hendaklah SharedFolder . Nama ini akan dapat dilihat oleh pelayan lain. Tambah SharedUser dalam keizinan.

Everyone Padamkan yang sedia ada .

Sahkan dengan kebenaran "Tukar".

Oleh kerana kami hanya menambah kebenaran yang boleh diakses dari luar, kami akan menetapkannya secara SharedUser dalaman supaya boleh beroperasi dalam folder ini.

Sahkan dengan kebenaran "Tukar".

Buat fail untuk menyemak operasi. Dalam program ini, pengekodan diproses dalam UFT-8, jadi sila simpan di UTF-8.

Tidak mengapa jika anda boleh mengakses dalam Explorer dari \\<サーバー名>\ PC lain, logSharedUser masuk dengan , dan melihat fail.

Buat program untuk membaca dan menulis fail daripada folder kongsian daripada aplikasi Teras ASP.NET

Operasi Mr./Ms. adalah untuk mengklik butang.

  • Muatkan fail dalam folder kongsian dan paparkannya pada skrin
  • Tulis fail baru ke folder kongsian

Proses.

Halaman Pisau Cukur dan kod MVC adalah contoh ini, tetapi program yang mengakses folder kongsian adalah sama untuk kedua-duanya. Perkara yang sama berlaku untuk API Web. Sekiranya ada, ia juga harus berfungsi dalam program pelanggan.

Proses yang bersambung ke rangkaian sepanjang tempoh proses tertentu

Cipta kod berikut di mana-mana sahaja dalam projek anda. Nama kelas adalah SharedFolderAccessor , tetapi nama itu sewenang-wenangnya. SharedFolderAccessor Anda boleh mengakses folder kongsian sehingga anda mencipta Dispose contoh . using membolehkan anda menentukan tempoh masa di mana akses boleh diakses dalam skop eksplisit.

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

Oleh kerana ia menggunakan API Win32 dan WNetAddConnection2 WNetCancelConnection2 , ia hanya berfungsi dalam persekitaran Windows. Saya mempunyai komen buat masa ini, tetapi jika anda ingin mengetahui lebih lanjut, sila lihat di Internet. Selain folder kongsian, anda juga boleh melakukan operasi untuk mengakses sumber rangkaian.

Ia mudah digunakan, dan jika anda menulis perkara berikut, anda using boleh mengakses folder kongsian semasa skop.

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

Walau bagaimanapun, pada hakikatnya WNetCancelConnection2 , sambungan tidak segera diputuskan pada masa panggilan , jadi using anda boleh mengakses folder kongsian walaupun selepas skop.

Kod ujian menggunakan SharedFolderAccessor

Oleh kerana proses mengakses folder kongsian tidak bergantung pada rangka kerja, kami membuat kaedah yang sama untuk menguji yang membaca dan menulis fail. Pazor Pages dan MVC harus dipanggil sama.

Kandungan adalah proses yang menulis teks yang dihantar kepada argumen ke folder kongsian, membaca fail teks yang sudah ada dalam folder kongsian, dan mengembalikan teks.

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

Laman Pisau Cukur

Dalam Halaman Cukur, kami meletakkan butang di Index.cshtml, kliknya, jalankan kod ujian, dan paparkan keputusan pada skrin. Dalam sesetengah kes, folder kongsian mungkin tidak boleh diakses, jadi ia disertakan dalam tangkapan cuba.

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

Begitu juga, dalam kes MVC, Index.cshtml butang diletakkan di dalam , dan apabila diklik, ia memanggil kod ujian folder kongsian.

Pengawal / 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>
@* ここまで追加 *@

Pengesahan operasi

Nyahpepijat dan sahkan bahawa anda boleh mengakses folder kongsian dengan jayanya.

Membina Pelayan Aplikasi

Oleh kerana kami telah mengesahkan bahawa folder kongsian boleh diakses dengan menjalankan program ini, langkah seterusnya adalah tidak perlu. Jika anda ingin menyemak operasi pada pelayan IIS, anda boleh melakukannya dengan mengikuti langkah-langkah di bawah.

Dari sini, ia adalah tambahan, jadi saya tidak akan menerangkannya dengan terlalu terperinci, tetapi terutamanya akan menerangkan imej.

Memasang IIS

Pasangkannya secara lalai daripada Pengurus Pelayan. Saya tidak akan masuk ke butiran prosedur.

Tiada ciri tambahan diperlukan.

Tiada perkhidmatan IIS tambahan diperlukan pada masa ini.

ASP.NET Pemasangan Himpunan Pengehosan Runtime Teras

Oleh kerana kita menggunakan ASP.NET Core 8, kita perlu memasang masa jalan dengan sewajarnya. Muat turun daripada URL berikut:

Untuk menjalankan ASP.NET Teras dalam IIS, anda memerlukan sesuatu yang dipanggil "Hosting Bundle". Muat turun "Hosting Bundle" dari ASP.NET Core Runtime.

Setelah dimuat turun, jalankannya pada pelayan.

Ikuti bestari untuk memasangnya.

Terbitkan program anda

Output program yang anda mahu gunakan ke IIS sebagai fail dari Visual Studio.

Ubah suai untuk Windows.

Terbitkan apabila anda selesai.

Jika anda klik pada lokasi sasaran, anda boleh membuka folder di mana fail yang diterbitkan terletak.

Anda tidak perlu membawa mereka semua, tetapi jika anda tidak pasti, anda boleh membawa semuanya buat masa ini. Pada ketika ini, anda hanya perlu memastikan bahawa fail itu wujud.

Mencipta dan Menggunakan Aplikasi Web

Daripada Alat Pentadbiran Windows, buka Pengurus Perkhidmatan Maklumat Internet (IIS).

Kami akan membuat laman web, tetapi kali ini kami akan menggunakan "Laman Web Lalai" yang ada dari awal.

Dengan Laman Web Lalai dipilih, klik Penjelajah untuk membuka folder. Salin program yang diterbitkan di sini. Anda boleh memadamkan fail asal.

Buka halaman daripada pautan IIS dan lihat sama ada skrin muncul. Anda boleh membuka penyemak imbas web terlebih dahulu dan masukkan terus URL.

Pengesahan operasi

Klik butang untuk mengesahkan bahawa ia berfungsi tanpa sebarang masalah. Dalam perkara di atas, ia diakses dari dalam pelayan web, tetapi kerana ia adalah pelayan web, ia sepatutnya mungkin untuk mengendalikannya dari PC lain.