Достъп до споделени папки на други сървъри от ASP.NET Core приложение (версия на мрежово свързана програма)

Страницата се актуализира :
Дата на създаване на страница :

Среда за проверка на експлоатацията

Визуално студио
  • Визуално студио 2022
ASP.NET Ядро
  • 8 (Бръсначи страници, MVC)
Сървър на Windows
  • 2022 г. (ASP.NET основни системни изисквания)
  • 2019 (сървър за разполагане на споделени папки)
ИИС
  • 10.0

Работна среда

Не сме го тествали във всички случаи, но трябва да работи общо при следните условия:

Визуално студио
  • Всичко, което може да развие ASP.NET основен проект
ASP.NET Ядро
  • Всяка версия (MVC, Razor Pages, API)
Сървър на Windows
  • Windows Server 2008 или по-нова версия
ИИС
  • 7.0 или по-късно

Предпоставка

  • ASP.NET Основните приложения са предназначени да работят на IIS.
  • Тъй като използва API на Windows за удостоверяване, той не работи на не-Windows.

околна среда

Тя се проверява в следната среда.

Цел на използване на персонални компютри и сървъри
Windows 11 (локално) Среда за разработване на програми.
СВ2022Тест Среда, която изпълнява IIS и ASP.NET Core. Достъп до споделената папка SV2019Test от тук
СВ2019Тест Сървъри със споделени папки

В допълнение, различните настройки са както следва.

Стойност на име на параметър
Потребителско име за достъп Споделен потребител
Име на споделена папка Споделена папка

Изграждане на сървър за споделени папки

Създаване на потребител

Създайте потребител за достъп до общата папка. В този случай ще създадем локален акаунт, но ако се занимавате със сървъри и акаунти в домейн като Active Directory, можете да използвате и него.

Процесът на създаване на потребител е извън обхвата на тези съвети, така че няма да навлизаме в твърде много подробности.

SharedUser В този случай ще го създадем с името . Тъй като този потребител не работи с екрана и не променя настройките, паролата не може да бъде променяна.

Ако оставите по подразбиране, можете да влезете с този потребител с отдалечен работен плот и т.н., така че, моля, премахнете от групата Users .

Създаване на споделена папка

Няма значение къде го създавате. Това е така, защото другите сървъри не се интересуват от местоположението на физическата папка. В този случай ще създадем папка с име директно под SharedFolder устройството C и ще я споделим.

Отворете свойствата и конфигурирайте настройките за споделяне.

Името на споделената папка трябва да SharedFolder бъде . Това име ще бъде видимо за други сървъри. Добавете SharedUser разрешенията.

Everyone Изтрийте съществуващия .

Потвърдете с разрешението "Промяна".

Тъй като сме добавили само разрешения, които могат да бъдат достъпни отвън, ще го настроим вътрешно SharedUser , така че да може да работи в тази папка.

Потвърдете с разрешението "Промяна".

Създайте файл, за да проверите операцията. В тази програма кодирането се обработва в UFT-8, така че моля, запазете го в UTF-8.

Добре е, ако можете да получите достъп в Explorer от \\<サーバー名>\ друг компютър, да влезетеSharedUser с и да прегледате файла.

Създаване на програма за четене и запис на файлове от споделена папка от приложение на ASP.NET Core

Операцията Mr./Ms. е да щракнете върху бутона.

  • Зареждане на файлове в споделена папка и показването им на екрана
  • Записване на нов файл в споделена папка

Процес.

Razor Pages и MVC кодът са примери за това, но програмата, която има достъп до споделената папка, е една и съща и за двете. Същото важи и за уеб API. Ако не друго, то трябва да работи и в клиентската програма.

Процес, който се свързва с мрежа за продължителността на конкретен процес

Създайте следния код навсякъде във вашия проект. Името на класа е SharedFolderAccessor , но името е произволно. SharedFolderAccessor Можете да получите достъп до споделената папка, докато не създадете Dispose екземпляр на . using ви позволява да зададете периода от време, през който достъпът може да бъде достъпен в изричен обхват.

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

Тъй като използва API на Win32 и WNetAddConnection2 WNetCancelConnection2 , той работи само в средата на Windows. Имам коментар за момента, но ако искате да знаете повече, моля, потърсете го в интернет. В допълнение към споделените папки можете също да извършвате операции за достъп до мрежови ресурси.

Той е лесен за използване и ако напишете следното, using можете да получите достъп до споделената папка по време на обхвата.

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

В действителност WNetCancelConnection2 обаче връзката не се прекъсва веднага в момента на обаждане , така че using можете да получите достъп до споделената папка дори след обхвата.

Тестов код с помощта на SharedFolderAccessor

Тъй като процесът на достъп до споделената папка не зависи от рамката, създаваме общ метод за тестване, който чете и записва файлове. Pazor Pages и MVC трябва да се наричат еднакви.

Съдържанието е процес, който записва текста, предаден на аргумента, в споделената папка, прочита текстовия файл, който вече е в споделената папка, и връща текста.

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 Pages поставяме бутон в Index.cshtml, кликваме върху него, изпълняваме тестовия код и показваме резултатите на екрана. В някои случаи споделената папка може да не е достъпна, така че е затворена в 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();
      }
    }
  }
}

Индекс.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

По същия начин, в случая на MVC, Index.cshtml в , се поставя бутон и когато се натисне, той извиква тестовия код на споделената папка.

Контролери/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();
    }

    // 省略
  }
}

Индекс.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>
@* ここまで追加 *@

Потвърждаване на операцията

Отстранете грешките и проверете дали имате успешен достъп до споделената папка.

Изграждане на сървър за приложения

Тъй като потвърдихме, че споделената папка може да бъде достъпна чрез стартиране на програмата, следващата стъпка е ненужна. Ако искате да проверите операцията на IIS сървъра, можете да го направите, като следвате стъпките по-долу.

Оттук това е допълнение, така че няма да го обяснявам твърде подробно, а главно ще обясня изображението.

Инсталиране на IIS

Инсталирайте го по подразбиране от диспечера на сървъри. Няма да навлизам в подробности за процедурата.

Не се изискват допълнителни функции.

В момента не се изискват допълнителни IIS услуги.

ASP.NET Инсталиране на основен хостинг пакет

Тъй като използваме ASP.NET Core 8, трябва да инсталираме съответно времето за изпълнение. Изтеглете го от следния URL адрес:

За да стартирате ASP.NET Core в IIS, имате нужда от нещо, наречено "Hosting Bundle". Изтеглете "Хостинг пакета" от ASP.NET Core Runtime.

След като го изтеглите, стартирайте го на сървъра.

Следвайте съветника, за да го инсталирате.

Публикуване на вашата програма

Изведете програмата, която искате да разположите в IIS, като файл от Visual Studio.

Променете го за Windows.

Публикувайте, когато сте готови.

Ако кликнете върху целевото местоположение, можете да отворите папката, където се намира публикуваният файл.

Не е нужно да ги носите всичките, но ако не сте сигурни, можете да ги вземете всички за сега. В този момент всичко, което трябва да направите, е да се уверите, че файлът съществува.

Създаване и разполагане на уеб приложения

От Windows Административни инструменти отворете диспечера на Internet Information Services (IIS).

Ще създадем сайт, но този път ще използваме "Уеб сайт по подразбиране", който е там от самото начало.

При избран уеб сайт по подразбиране щракнете върху Explorer, за да отворите папката. Копирайте публикуваната програма тук. Можете да изтриете оригиналния файл.

Отворете страницата от връзката IIS и вижте дали екранът ще се появи. Можете първо да отворите уеб браузър и да въведете URL адреса директно.

Потвърждаване на операцията

Щракнете върху бутона, за да проверите дали работи без никакви проблеми. В горното той е достъпен от уеб сървъра, но тъй като е уеб сървър, трябва да е възможно да се работи от други компютри.