Muiden palvelimien jaettujen kansioiden käyttäminen ASP.NET Core -sovelluksesta (Network Connected Program -versio)

Sivu päivitetty :
Sivun luontipäivämäärä :

Toiminnan todentamisympäristö

Visuaalinen studio
  • Visuaalinen studio 2022
ASP.NET ydin
  • 8 (partakoneen sivut, MVC)
Windows Server
  • 2022 (ASP.NET ydinjärjestelmävaatimukset)
  • 2019 (jaettujen kansioiden käyttöönottopalvelin)
IIS
  • 10.0

Toimintaympäristö

Emme ole testanneet sitä kaikissa tapauksissa, mutta sen pitäisi toimia yleensä seuraavissa olosuhteissa:

Visuaalinen studio
  • Kaikki, mikä voi kehittää ASP.NET Core -projektin
ASP.NET ydin
  • Mikä tahansa versio (MVC, Razor Pages, API)
Windows Server
  • Windows Server 2008 tai uudempi
IIS
  • 7.0 tai uudempi

edellytys

  • ASP.NET Core -sovellukset on tarkoitettu toimimaan IIS:ssä.
  • Koska se käyttää Windows-ohjelmointirajapintoja todentamiseen, se ei toimi muissa kuin Windowsissa.

ympäristö

Se tarkistetaan seuraavassa ympäristössä.

Tietokoneiden ja palvelimien käyttötarkoitus
Windows 11 (paikallinen) Ympäristö ohjelmien kehittämiselle.
SV2022Testi Ympäristö, jossa on IIS ja ASP.NET Core. Siirry jaettuun SV2019Test-kansioon täältä
SV2019Testi Palvelimet, joissa on jaettuja kansioita

Lisäksi eri asetukset ovat seuraavat.

Parametrin nimen arvo
Käytä käyttäjänimeä SharedUser
Jaetun kansion nimi SharedFolder

Jaetun kansiopalvelimen luominen

Luo käyttäjä

Luo käyttäjä, joka käyttää yhteistä kansiota. Tässä tapauksessa luomme paikallisen tilin, mutta jos olet tekemisissä Active Directoryn kaltaisen verkkotunnuksen palvelimien ja tilien kanssa, voit käyttää myös sitä.

Käyttäjän luomisprosessi ei kuulu näiden vinkkien piiriin, joten emme mene liikaa yksityiskohtiin.

SharedUser Tässä tapauksessa luomme sen nimellä . Koska tämä käyttäjä ei käytä näyttöä tai muuta asetuksia, salasanaa ei voi muuttaa.

Jos jätät oletusasetuksen, voit kirjautua sisään tällä käyttäjällä etätyöpöydällä jne., joten poista ryhmästä Users .

Jaetun kansion luominen

Sillä ei ole väliä, missä luot sen. Tämä johtuu siitä, että muut palvelimet eivät välitä fyysisen kansion sijainnista. Tässä tapauksessa luomme kansion, joka on nimetty suoraan C-aseman alle SharedFolder , ja jaamme sen.

Avaa ominaisuudet ja määritä jakamisasetukset.

Jaetun kansion nimen tulee SharedFolder olla . Tämä nimi näkyy muille palvelimille. Lisää SharedUser käyttöoikeudet.

Everyone Poista nykyinen .

Vahvista "Muuta" -oikeudella.

Koska olemme lisänneet vain käyttöoikeuksia, joihin pääsee ulkopuolelta, asetamme sen sisäisesti SharedUser , jotta se voi toimia tässä kansiossa.

Vahvista "Muuta" -oikeudella.

Luo tiedosto toiminnon tarkistamiseksi. Tässä ohjelmassa koodaus käsitellään UFT-8: ssa, joten tallenna se UTF-8: een.

On OK, jos voit käyttää Exploreria \\<サーバー名>\ toisesta tietokoneesta, kirjautuaSharedUser sisään ja tarkastella tiedostoa.

Luo ohjelma tiedostojen lukemista ja kirjoittamista varten jaetusta kansiosta ASP.NET Core -sovelluksesta

Mr./Ms.-toiminto on napsauttaa painiketta.

  • Lataa tiedostot jaettuun kansioon ja näytä ne näytössä
  • Uuden tiedoston kirjoittaminen jaettuun kansioon

prosessi.

Razor Pages ja MVC-koodi ovat esimerkkejä tästä, mutta jaettua kansiota käyttävä ohjelma on sama molemmille. Sama pätee verkko-ohjelmointirajapintoihin. Jos jotain, sen pitäisi toimia myös asiakasohjelmassa.

Prosessi, joka muodostaa yhteyden verkkoon tietyn prosessin ajaksi

Luo seuraava koodi mihin tahansa projektin kohtaan. Luokan nimi on SharedFolderAccessor , mutta nimi on mielivaltainen. SharedFolderAccessor Voit käyttää jaettua kansiota, kunnes luot Dispose . using Voit määrittää ajanjakson, jonka aikana käyttöoikeutta voidaan käyttää eksplisiittisessä laajuudessa.

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

Koska se käyttää Win32-ohjelmointirajapintoja ja WNetAddConnection2 WNetCancelConnection2 , se toimii vain Windows-ympäristössä. Minulla on toistaiseksi kommentti, mutta jos haluat tietää enemmän, etsi se Internetistä. Jaettujen kansioiden lisäksi voit myös suorittaa toimintoja verkkoresurssien käyttämiseksi.

Sitä on helppo käyttää, ja jos kirjoitat seuraavan, voit using käyttää jaettua kansiota laajuuden aikana.

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

Kuitenkin todellisuudessa WNetCancelConnection2 , yhteyttä ei katkaista välittömästi soiton aikana , joten using voit käyttää jaettua kansiota myös laajuuden jälkeen.

Koodin testaaminen SharedFolderAccessorin avulla

Koska jaetun kansion käyttöprosessi ei riipu kehyksestä, luomme yhteisen testausmenetelmän, joka lukee ja kirjoittaa tiedostoja. Pazor Pagesia ja MVC: tä tulisi kutsua samaksi.

Sisältö on prosessi, joka kirjoittaa argumenttiin välitetyn tekstin jaettuun kansioon, lukee jaetussa kansiossa jo olevan tekstitiedoston ja palauttaa tekstin.

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

Partakoneen sivut

Razor Pagesissa asetamme painikkeen Index.cshtml-tiedostoon, napsautamme sitä, suoritamme testikoodin ja näytämme tulokset näytöllä. Joissakin tapauksissa jaettu kansio ei ehkä ole käytettävissä, joten se on suljettu try-catchiin.

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

Hakemisto.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

Vastaavasti MVC Index.cshtml : n tapauksessa painike sijoitetaan , ja kun sitä napsautetaan, se kutsuu jaetun kansion testikoodia.

Ohjaimet/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();
    }

    // 省略
  }
}

Hakemisto.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>
@* ここまで追加 *@

Toiminnan vahvistaminen

Tee virheenkorjaus ja varmista, että pystyt käyttämään jaettua kansiota.

Sovelluspalvelimen rakentaminen

Koska olemme vahvistaneet, että jaettuun kansioon pääsee suorittamalla ohjelma, seuraava vaihe on tarpeeton. Jos haluat tarkistaa toiminnon IIS-palvelimessa, voit tehdä sen noudattamalla seuraavia ohjeita.

Tästä eteenpäin se on täydennys, joten en selitä sitä liian yksityiskohtaisesti, vaan selitän pääasiassa kuvan.

IIS:n asentaminen

Asenna se oletusarvoisesti Server Managerista. En mene menettelyn yksityiskohtiin.

Lisäominaisuuksia ei tarvita.

Muita IIS-palveluita ei tällä hetkellä tarvita.

ASP.NET Core Runtime Hosting -paketin asennus

Koska käytämme ASP.NET Core 8: ta, meidän on asennettava ajonaika vastaavasti. Lataa se seuraavasta URL-osoitteesta:

Jotta voit suorittaa ASP.NET Coren IIS: ssä, tarvitset jotain nimeltä "Hosting Bundle". Lataa "Hosting Bundle" ASP.NET Core Runtimesta.

Kun olet ladannut, suorita se palvelimella.

Asenna se noudattamalla ohjattua toimintoa.

Julkaise ohjelmasi

Tulosta IIS:ään otettava ohjelma tiedostona Visual Studiosta.

Muokkaa sitä Windowsia varten.

Julkaise, kun olet valmis.

Jos napsautat kohdesijaintia, voit avata kansion, jossa julkaistu tiedosto sijaitsee.

Sinun ei tarvitse tuoda niitä kaikkia, mutta jos et ole varma, voit ottaa ne kaikki toistaiseksi. Tässä vaiheessa sinun tarvitsee vain varmistaa, että tiedosto on olemassa.

Verkkosovellusten luominen ja käyttöönotto

Avaa Windowsin valvontatyökaluissa IIS (Internet Information Services) Manager.

Luomme sivuston, mutta tällä kertaa käytämme "oletussivustoa", joka on siellä alusta alkaen.

Kun Oletussivusto on valittuna, avaa kansio valitsemalla Explorer. Kopioi julkaistu ohjelma tästä. Voit poistaa alkuperäisen tiedoston.

Avaa sivu IIS-linkistä ja katso, näkyykö näyttö. Voit avata ensin verkkoselaimen ja kirjoittaa URL-osoitteen suoraan.

Toiminnan vahvistaminen

Napsauta painiketta varmistaaksesi, että se toimii ilman ongelmia. Edellä mainitussa sitä käytetään verkkopalvelimelta, mutta koska se on verkkopalvelin, sitä pitäisi voida käyttää muista tietokoneista.