Juurdepääs teiste serverite ühiskaustadele ASP.NET Core'i rakenduse kaudu (võrguühendusega programmi versioon)

Lehekülg uuendatud :
Lehe loomise kuupäev :

Toimingu kontrollimise keskkond

Visuaalne stuudio
  • Visual Studio 2022
ASP.NET Tuum
  • 8 (habemenuga lehed, MVC)
Windows Server
  • 2022 (ASP.NET põhisüsteemi nõuded)
  • 2019 (ühiskausta juurutusserver)
IIS
  • 10.0

Töökeskkond

Me pole seda kõigil juhtudel testinud, kuid see peaks üldiselt töötama järgmistel tingimustel:

Visuaalne stuudio
  • Kõik, mis võib arendada ASP.NET põhiprojekti
ASP.NET Tuum
  • Kõik versioonid (MVC, Razor Pages, API)
Windows Server
  • Windows Server 2008 või uuem
IIS
  • 7.0 või uuem

eeltingimus

  • ASP.NET Põhirakendused on mõeldud töötama IIS-is.
  • Kuna see kasutab autentimiseks Windowsi API-sid, ei tööta see mitte-Windowsis.

keskkond

Seda kontrollitakse järgmises keskkonnas.

Arvutite ja serverite kasutamise eesmärk
Windows 11 (kohalik) Keskkond programmide arendamiseks.
SV2022Test Keskkond, mis käitab IIS-i ja ASP.NET Core'i. Juurdepääs jagatud kaustale SV2019Test siit
SV2019Test Jagatud kaustadega serverid

Lisaks on erinevad seaded järgmised.

Parameetri nimi Väärtus
Juurdepääsu kasutajanimi Jagatudkasutaja
Ühiskausta nimi Jagatud kaust

Ühiskaustaserveri loomine

Kasutaja loomine

Looge kasutaja, kes pääseb juurde ühisele kaustale. Sel juhul loome kohaliku konto, kuid kui teil on tegemist serverite ja kontodega sellises domeenis nagu Active Directory, saate ka seda kasutada.

Kasutaja loomise protsess jääb nende näpunäidete ulatusest välja, nii et me ei lasku liiga palju üksikasjadesse.

SharedUser Sel juhul loome selle nimega . Kuna see kasutaja ei kasuta ekraani ega muuda seadeid, ei saa parooli muuta.

Kui jätate vaikimisi, saate selle kasutajaga sisse logida kaugtöölaua jms abil, nii et palun eemaldage grupist Users .

Ühiskausta loomine

Pole tähtis, kus te selle loote. Seda seetõttu, et teised serverid ei hooli füüsilise kausta asukohast. Sel juhul loome kausta, mille nimi on otse C-draivi all SharedFolder , ja jagame seda.

Avage atribuudid ja konfigureerige jagamissätted.

Ühiskausta nimi peaks SharedFolder olema . See nimi on nähtav teistele serveritele. Lisage SharedUser õigused.

Everyone Kustutage olemasolev .

Kinnitage loaga "Muuda".

Kuna oleme lisanud ainult õigused, millele pääseb juurde väljastpoolt, seame selle sisemiselt SharedUser nii, et see saaks selles kaustas töötada.

Kinnitage loaga "Muuda".

Toimingu kontrollimiseks looge fail. Selles programmis töödeldakse kodeeringut UFT-8-s, nii et palun salvestage see UTF-8-sse.

See on OK, kui pääsete Exploreris juurde teisest arvutist \\<サーバー名>\ , logiteSharedUser sisse ja vaatate faili.

Programmi loomine failide lugemiseks ja kirjutamiseks ASP.NET Core'i rakenduse ühiskaustast

Mr./Ms. toiming on nupule klõpsamine.

  • Laadige failid ühiskausta ja kuvage need ekraanil
  • Uue faili kirjutamine ühiskausta

protsess.

Razor Pages ja MVC kood on selle näited, kuid programm, mis pääseb juurde jagatud kaustale, on mõlema jaoks sama. Sama kehtib ka veebi API-de kohta. Kui midagi, peaks see töötama ka kliendiprogrammis.

Protsess, mis loob võrguga ühenduse konkreetse protsessi kestel;

Looge järgmine kood oma projekti mis tahes kohas. Klassi nimi on SharedFolderAccessor , kuid nimi on meelevaldne. SharedFolderAccessor Ühiskaustale pääsete juurde seni, kuni loote Dispose . using võimaldab teil määrata ajavahemiku, mille jooksul juurdepääsule pääseb juurde selgesõnalises ulatuses.

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

Kuna see kasutab Win32 API-sid ja WNetAddConnection2 WNetCancelConnection2 , töötab see ainult Windowsi keskkonnas. Mul on praegu kommentaar, kuid kui soovite rohkem teada saada, otsige see Internetist üles. Lisaks jagatud kaustadele saate teha ka toiminguid võrguressurssidele juurdepääsuks.

Seda on lihtne kasutada ja kui kirjutate järgmist, pääsete using laiendatud kaustale juurde ka ulatuse ajal.

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

Kuid tegelikult WNetCancelConnection2 , ühendust ei katkestata kohe helistamise ajal , nii et using pääsete jagatud kaustale juurde ka pärast ulatust.

Testige koodi SharedFolderAccessori abil

Kuna jagatud kaustale juurdepääsu protsess ei sõltu raamistikust, loome testimiseks ühise meetodi, mis loeb ja kirjutab faile. Pazor Pages ja MVC tuleks nimetada samaks.

Sisu on protsess, mis kirjutab argumendile edastatud teksti ühiskausta, loeb ühiskaustas juba olevat tekstifaili ja tagastab teksti.

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

Habemenuga lehed

Razor Pages'is asetame nupu Index.cshtml, klõpsake seda, käivitage testkood ja kuvage tulemused ekraanil. Mõnel juhul ei pruugi jagatud kaust olla juurdepääsetav, nii et see on ümbritsetud proovipüügiga.

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

Samamoodi paigutatakse MVC Index.cshtml puhul nupp sisse ja klõpsamisel helistab see jagatud kausta testkoodile.

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

Toimingu kinnitamine

Siluge ja kontrollige, kas pääsete jagatud kaustale edukalt juurde.

Rakendusserveri loomine

Kuna oleme kinnitanud, et jagatud kaustale pääseb juurde programmi käivitamisega, pole järgmine samm vajalik. Kui soovite IIS-serveris toimingut kontrollida, saate seda teha, järgides alltoodud samme.

Siit on see täiendus, nii et ma ei selgita seda liiga üksikasjalikult, vaid selgitan peamiselt pilti.

IIS-i installimine

Installige see serverihaldurist vaikimisi. Ma ei lasku protseduuri üksikasjadesse.

Lisafunktsioone pole vaja.

Praegu pole täiendavaid IIS-teenuseid vaja.

ASP.NET Core Runtime Hosting Bundle'i installimine

Kuna kasutame ASP.NET Core 8, peame vastavalt installima käitusaja vastavalt. Laadige see alla järgmiselt URL-ilt:

Selleks, et käivitada ASP.NET Core IIS-is, vajate midagi, mida nimetatakse "Hosting Bundle". Laadige alla "Hosting Bundle" ASP.NET Core Runtime'ist.

Pärast allalaadimist käivitage see serveris.

Selle installimiseks järgige viisardit.

Programmi avaldamine

Väljastage programm, mille soovite IIS-i juurutada, failina Visual Studiost.

Muutke seda Windowsi jaoks.

Avaldage, kui olete lõpetanud.

Kui klõpsate sihtasukohal, saate avada kausta, kus avaldatud fail asub.

Te ei pea neid kõiki tooma, kuid kui te pole kindel, võite need kõik praegu võtta. Sel hetkel pole vaja teha muud, kui veenduda, et fail on olemas.

Veebirakenduste loomine ja juurutamine

Avage Windowsi haldustööriistade kaudu Internet Information Services (IIS) Manager.

Loome saidi, kuid seekord kasutame "Vaikimisi veebisaiti", mis on seal algusest peale.

Kui valitud on vaikeveebisait, klõpsake kausta avamiseks nuppu Explorer. Kopeerige avaldatud programm siia. Saate algse faili kustutada.

Avage leht IIS-i lingilt ja vaadake, kas ekraan ilmub. Kõigepealt saate avada veebibrauseri ja sisestada URL-i otse.

Toimingu kinnitamine

Klõpsake nuppu, et kontrollida, kas see töötab ilma probleemideta. Ülaltoodus pääseb sellele juurde veebiserverist, kuid kuna see on veebiserver, peaks seda olema võimalik kasutada teistest arvutitest.