Πρόσβαση σε κοινόχρηστους φακέλους σε άλλους διακομιστές από μια εφαρμογή ASP.NET Core (έκδοση προγράμματος συνδεδεμένου στο δίκτυο)
Περιβάλλον επαλήθευσης λειτουργίας
- Οπτικό στούντιο
-
- Visual Studio 2022
- ASP.NET Πυρήνας
-
- 8 (Σελίδες ξυραφιού, MVC)
- Διακομιστής των Windows
-
- 2022 (ASP.NET Βασικές απαιτήσεις συστήματος)
- 2019 (διακομιστής ανάπτυξης κοινόχρηστου φακέλου)
- IIS
-
- 10.0
Περιβάλλον λειτουργίας
Δεν το έχουμε δοκιμάσει σε όλες τις περιπτώσεις, αλλά θα πρέπει να λειτουργεί γενικά υπό τις ακόλουθες συνθήκες:
- Οπτικό στούντιο
-
- Οτιδήποτε μπορεί να αναπτύξει ένα έργο ASP.NET Core
- ASP.NET Πυρήνας
-
- Οποιαδήποτε έκδοση (MVC, Razor Pages, API)
- Διακομιστής των Windows
-
- Windows Server 2008 ή νεότερη έκδοση
- IIS
-
- 7.0 ή νεότερη έκδοση
Προϋπόθεση
- ASP.NET Οι βασικές εφαρμογές προορίζονται για εκτέλεση στις υπηρεσίες IIS.
- Δεδομένου ότι χρησιμοποιεί API των Windows για έλεγχο ταυτότητας, δεν λειτουργεί σε μη Windows.
περιβάλλον
Επαληθεύεται στο ακόλουθο περιβάλλον.
Σκοπός χρήσης προσωπικών | υπολογιστών και διακομιστών |
---|---|
Windows 11 (τοπικά) | Ένα περιβάλλον για την ανάπτυξη προγραμμάτων. |
SV2022Δοκιμή | Ένα περιβάλλον που εκτελεί τις υπηρεσίες IIS και ASP.NET πυρήνα. Αποκτήστε πρόσβαση στον κοινόχρηστο φάκελο SV2019Test από εδώ |
SV2019Δοκιμή | Διακομιστές με κοινόχρηστους φακέλους |
Επιπλέον, οι διάφορες ρυθμίσεις έχουν ως εξής.
Τιμή ονόματος παραμέτρου | |
---|---|
Πρόσβαση στο όνομα χρήστη | Κοινόχρηστοςχρήστης |
Όνομα κοινόχρηστου φακέλου | SharedFolder |
Δημιουργία διακομιστή κοινόχρηστων φακέλων
Δημιουργία χρήστη
Δημιουργήστε ένα χρήστη για πρόσβαση στον κοινόχρηστο φάκελο. Σε αυτήν την περίπτωση, θα δημιουργήσουμε έναν τοπικό λογαριασμό, αλλά εάν ασχολείστε με διακομιστές και λογαριασμούς σε έναν τομέα όπως η υπηρεσία καταλόγου Active Directory, μπορείτε να τον χρησιμοποιήσετε επίσης.
Η διαδικασία δημιουργίας ενός χρήστη είναι πέρα από το πεδίο εφαρμογής αυτών των συμβουλών, οπότε δεν θα μπούμε σε πολλές λεπτομέρειες.
SharedUser
Σε αυτήν την περίπτωση, θα το δημιουργήσουμε με το όνομα .
Δεδομένου ότι αυτός ο χρήστης δεν χειρίζεται την οθόνη ή δεν αλλάζει τις ρυθμίσεις, ο κωδικός πρόσβασης δεν μπορεί να αλλάξει.
Εάν αφήσετε την προεπιλογή, μπορείτε να συνδεθείτε με αυτόν τον χρήστη με την Απομακρυσμένη επιφάνεια εργασίας κ.λπ., οπότε αφαιρέστε από την ομάδα Users
.
Δημιουργία κοινόχρηστου φακέλου
Δεν έχει σημασία πού το δημιουργείτε. Αυτό συμβαίνει επειδή άλλοι διακομιστές δεν ενδιαφέρονται για τη θέση του φυσικού φακέλου.
Σε αυτήν την περίπτωση, θα δημιουργήσουμε έναν φάκελο που ονομάζεται απευθείας κάτω από SharedFolder
τη μονάδα δίσκου C και θα τον μοιραστούμε.
Ανοίξτε τις ιδιότητες και διαμορφώστε τις ρυθμίσεις κοινής χρήσης.
Το όνομα του κοινόχρηστου φακέλου πρέπει SharedFolder
να είναι . Αυτό το όνομα θα είναι ορατό σε άλλους διακομιστές.
Προσθέστε SharedUser
τα δικαιώματα.
Everyone
Διαγράψτε το υπάρχον αρχείο .
Επιβεβαιώστε με την άδεια "Αλλαγή".
Δεδομένου ότι έχουμε προσθέσει μόνο δικαιώματα στα οποία μπορείτε να έχετε πρόσβαση από έξω, θα το ρυθμίσουμε εσωτερικά SharedUser
έτσι ώστε να μπορεί να λειτουργήσει σε αυτόν τον φάκελο.
Επιβεβαιώστε με την άδεια "Αλλαγή".
Δημιουργήστε ένα αρχείο για να ελέγξετε τη λειτουργία. Σε αυτό το πρόγραμμα, η κωδικοποίηση υποβάλλεται σε επεξεργασία σε UFT-8, οπότε αποθηκεύστε την σε UTF-8.
Είναι εντάξει εάν μπορείτε να αποκτήσετε πρόσβαση στον Explorer από \\<サーバー名>\
άλλο υπολογιστή, να συνδεθείτεSharedUser
με το , και να δείτε το αρχείο.
Δημιουργήστε ένα πρόγραμμα για την ανάγνωση και εγγραφή αρχείων από έναν κοινόχρηστο φάκελο από μια εφαρμογή ASP.NET Core
Η λειτουργία Mr./Ms. είναι να κάνετε κλικ στο κουμπί.
- Φορτώστε αρχεία σε έναν κοινόχρηστο φάκελο και εμφανίστε τα στην οθόνη
- Εγγραφή νέου αρχείου σε κοινόχρηστο φάκελο
διεργασία.
Οι σελίδες ξυραφιού και ο κώδικας MVC είναι παραδείγματα αυτού, αλλά το πρόγραμμα που αποκτά πρόσβαση στον κοινόχρηστο φάκελο είναι το ίδιο και για τα δύο. Το ίδιο ισχύει και για τα API Web. Αν μη τι άλλο, θα πρέπει να λειτουργεί και στο πρόγραμμα-πελάτη.
Μια διαδικασία που συνδέεται σε ένα δίκτυο κατά τη διάρκεια μιας συγκεκριμένης διαδικασίας
Δημιουργήστε τον ακόλουθο κώδικα οπουδήποτε στο έργο σας. Το όνομα της κλάσης είναι 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">共有フォルダのあるサーバーを「\\<サーバー名>」形式で指定します。</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
να μπορείτε να έχετε πρόσβαση στον κοινόχρηστο φάκελο ακόμα και μετά το πεδίο εφαρμογής.
- WNetAddConnection2A (Συνάρτηση WNetAddConnection2A)
- WNetCancelConnection2A (Συνάρτηση WNetCancelConnection2A)
Δοκιμή κώδικα με χρήση του SharedFolderAccessor
Δεδομένου ότι η διαδικασία πρόσβασης στον κοινόχρηστο φάκελο δεν εξαρτάται από το πλαίσιο, δημιουργούμε μια κοινή μέθοδο δοκιμής που διαβάζει και γράφει αρχεία. Οι σελίδες Pazor και το 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 Εγκατάσταση πακέτου φιλοξενίας Core Runtime
Δεδομένου ότι χρησιμοποιούμε ASP.NET Core 8, πρέπει να εγκαταστήσουμε ανάλογα τον χρόνο εκτέλεσης. Κατεβάστε το από την ακόλουθη διεύθυνση URL:
Για να εκτελέσετε το ASP.NET Core στις υπηρεσίες IIS, χρειάζεστε κάτι που ονομάζεται "Πακέτο φιλοξενίας". Κατεβάστε το "Hosting Bundle" από το ASP.NET Core Runtime.
Μετά τη λήψη, εκτελέστε το στο διακομιστή.
Ακολουθήστε τον οδηγό για να το εγκαταστήσετε.
Δημοσιεύστε το πρόγραμμά σας
Εξάγετε το πρόγραμμα που θέλετε να αναπτύξετε στις υπηρεσίες IIS ως αρχείο από το Visual Studio.
Τροποποιήστε το για Windows.
Δημοσιεύστε όταν τελειώσετε.
Εάν κάνετε κλικ στη θέση προορισμού, μπορείτε να ανοίξετε το φάκελο όπου βρίσκεται το δημοσιευμένο αρχείο.
Δεν χρειάζεται να τα φέρετε όλα, αλλά αν δεν είστε σίγουροι, μπορείτε να τα πάρετε όλα προς το παρόν. Σε αυτό το σημείο, το μόνο που χρειάζεται να κάνετε είναι να βεβαιωθείτε ότι το αρχείο υπάρχει.
Δημιουργία και ανάπτυξη εφαρμογών Web
Από τα εργαλεία διαχείρισης των Windows, ανοίξτε τη Διαχείριση υπηρεσιών Internet Information Services (IIS).
Θα δημιουργήσουμε έναν ιστότοπο, αλλά αυτή τη φορά θα χρησιμοποιήσουμε τον "Προεπιλεγμένο ιστότοπο" που υπάρχει από την αρχή.
Με ενεργοποιημένη την επιλογή Προεπιλεγμένη τοποθεσία Web, κάντε κλικ στην επιλογή Explorer για να ανοίξετε το φάκελο. Αντιγράψτε το δημοσιευμένο πρόγραμμα εδώ. Μπορείτε να διαγράψετε το αρχικό αρχείο.
Ανοίξτε τη σελίδα από τη σύνδεση IIS και δείτε εάν εμφανίζεται η οθόνη. Μπορείτε πρώτα να ανοίξετε ένα πρόγραμμα περιήγησης ιστού και να εισαγάγετε απευθείας τη διεύθυνση URL.
Επιβεβαίωση λειτουργίας
Κάντε κλικ στο κουμπί για να επαληθεύσετε ότι λειτουργεί χωρίς προβλήματα. Στα παραπάνω, η πρόσβαση γίνεται μέσα από τον διακομιστή ιστού, αλλά δεδομένου ότι είναι διακομιστής ιστού, θα πρέπει να είναι δυνατή η λειτουργία του από άλλους υπολογιστές.