גישה לתיקיות משותפות בשרתים אחרים מיישום ASP.NET Core (גירסת תוכנית מחוברת לרשת)
סביבת אימות פעולה
- Visual Studio
-
- Visual Studio 2022
- ASP.NET Core
-
- 8 (דפי גילוח, MVC)
- שרת Windows
-
- 2022 (ASP.NET דרישות מערכת הליבה)
- 2019 (שרת פריסת תיקיות משותפות)
- IIS
-
- 10.0
סביבת הפעלה
לא בדקנו אותו בכל המקרים, אבל הוא אמור לעבוד באופן כללי בתנאים הבאים:
- Visual Studio
-
- כל דבר שיכול לפתח פרויקט ליבה ASP.NET
- ASP.NET Core
-
- כל גרסה (MVC, דפי גילוח, API)
- שרת Windows
-
- Windows Server 2008 ואילך
- IIS
-
- 7.0 ואילך
תנאי מקדים
- יישומי ליבה ASP.NET מיועדים לפעול ב- IIS.
- מכיוון שהוא משתמש בממשקי API של Windows לאימות, הוא אינו פועל בממשקי API שאינם של Windows.
סביבה
הוא מאומת בסביבה הבאה.
מטרת השימוש במחשבים | אישיים ובשרתים |
---|---|
Windows 11 (מקומי) | סביבה לפיתוח תוכניות. |
SV2022בדיקה | סביבה שבה פועל IIS ו- ASP.NET Core. גש לתיקייה המשותפת SV2019Test מכאן |
SV2019Test | שרתים עם תיקיות משותפות |
בנוסף, ההגדרות השונות הן כדלקמן.
ערך | שם פרמטר |
---|---|
שם משתמש של Access | SharedUser |
שם תיקיה משותפת | SharedFolder |
בניית שרת תיקיות משותף
יצירת משתמש
צור משתמש כדי לגשת לתיקיה הנפוצה. במקרה זה, ניצור חשבון מקומי, אך אם אתה מתמודד עם שרתים וחשבונות בתחום כגון Active Directory, תוכל להשתמש גם בו.
תהליך יצירת המשתמש הוא מעבר לטווח של טיפים אלה, ולכן לא ניכנס לפרטים רבים מדי.
SharedUser
במקרה זה, ניצור אותו עם השם .
מכיוון שמשתמש זה אינו מפעיל את המסך או משנה את ההגדרות, לא ניתן לשנות את הסיסמה.
אם אתה משאיר את ברירת המחדל, אתה יכול להיכנס עם משתמש זה עם שולחן עבודה מרוחק, וכו ', אז בבקשה להסיר מהקבוצה Users
.
יצירת תיקיה משותפת
זה לא משנה איפה אתה יוצר את זה. הסיבה לכך היא שלשרתים אחרים לא אכפת ממיקום התיקיה הפיזית.
במקרה זה, ניצור תיקיה בשם ישירות תחת SharedFolder
כונן C ונשתף אותה.
פתח את המאפיינים וקבע את תצורת הגדרות השיתוף.
שם התיקיה המשותפת צריך SharedFolder
להיות . שם זה יהיה גלוי לשרתים אחרים.
הוסף SharedUser
את ההרשאות.
Everyone
מחק את הקיים .
אשר עם הרשאת "שנה".
מכיוון שהוספנו רק הרשאות שניתן לגשת אליהן מבחוץ, נגדיר אותו באופן SharedUser
פנימי כך שיוכל לפעול בתיקיה זו.
אשר עם הרשאת "שנה".
צור קובץ כדי לבדוק את הפעולה. בתוכנית זו, הקידוד מעובד ב- UFT-8, אז אנא שמור אותו ב- UTF-8.
זה בסדר אם אתה יכול לגשת ב- Explorer ממחשב \\<サーバー名>\
אחר, להיכנסSharedUser
באמצעות ולהציג את הקובץ.
יצירת תוכנית לקריאה וכתיבה של קבצים מתיקיה משותפת מיישום ASP.NET Core
הפעולה של Mr./Ms. היא ללחוץ על הכפתור.
- טעינת קבצים בתיקיה משותפת והצגתם על המסך
- כתיבת קובץ חדש לתיקיה משותפת
תהליך.
דפי גילוח וקוד 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">共有フォルダのあるサーバーを「\\<サーバー名>」形式で指定します。</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
מכיוון שתהליך הגישה לתיקיה המשותפת אינו תלוי במסגרת, אנו יוצרים שיטה משותפת לבדיקה הקוראת וכותבת קבצים. דפי פזור ו- 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));
}
}
}
דפי גילוח
בדפי גילוח, אנו מציבים כפתור ב- Index.cshtml, לוחצים עליו, מריצים את קוד הבדיקה ומציגים את התוצאות על המסך. במקרים מסוימים, ייתכן שהתיקיה המשותפת לא תהיה נגישה, ולכן היא סגורה בניסיון מלכוד.
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
באופן דומה, במקרה של 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();
}
// 省略
}
}
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>
@* ここまで追加 *@
אישור פעולה
אתר באגים וודא שבאפשרותך לגשת בהצלחה לתיקיה המשותפת.
בניית שרת יישומים
מכיוון שאישרנו שניתן לגשת לתיקיה המשותפת על ידי הפעלת התוכנית, השלב הבא מיותר. אם ברצונך לבדוק את הפעולה בשרת IIS, באפשרותך לעשות זאת על-ידי ביצוע השלבים הבאים.
מכאן, זה תוספת, אז אני לא אסביר את זה בפירוט רב מדי, אבל בעיקר להסביר את התמונה.
התקנת IIS
התקן אותו כברירת מחדל ממנהל השרת. לא אכנס לפרטי הנוהל.
אין צורך בתכונות נוספות.
אין צורך בשירותי IIS נוספים בשלב זה.
ASP.NET התקנת חבילת אחסון Core Runtime
מכיוון שאנו משתמשים ב- ASP.NET- Core 8, עלינו להתקין את זמן הריצה בהתאם. הורד אותו מכתובת האתר הבאה:
כדי להפעיל ASP.NET Core ב- IIS, אתה צריך משהו שנקרא "חבילת אירוח". הורד את "חבילת אירוח" מ- ASP.NET Core Runtime.
לאחר ההורדה, הפעל אותו בשרת.
בצע את פעולת האשף כדי להתקין אותה.
פרסום התוכנית שלך
פלט את התוכנית שברצונך לפרוס ב- IIS כקובץ מ- Visual Studio.
שנה אותו עבור Windows.
פרסם כשתסיים.
אם תלחץ על מיקום היעד, תוכל לפתוח את התיקיה שבה נמצא הקובץ שפורסם.
אתה לא חייב להביא את כולם, אבל אם אתה לא בטוח, אתה יכול לקחת את כולם לעת עתה. בשלב זה, כל שעליך לעשות הוא לוודא שהקובץ קיים.
יצירה ופריסה של יישומי אינטרנט
מתוך כלי הניהול של Windows, פתח את Internet Information Services (IIS) Manager.
אנו ניצור אתר, אך הפעם נשתמש ב"אתר ברירת המחדל" שנמצא שם מההתחלה.
כאשר אתר אינטרנט המהווה ברירת מחדל נבחר, לחץ על Explorer כדי לפתוח את התיקיה. העתק את התוכנית שפורסמה כאן. באפשרותך למחוק את הקובץ המקורי.
פתח את הדף מהקישור IIS ובדוק אם המסך מופיע. באפשרותך לפתוח דפדפן אינטרנט תחילה ולהזין את כתובת האתר ישירות.
אישור פעולה
לחץ על הלחצן כדי לוודא שהוא פועל ללא בעיות. לעיל, הוא ניגש מתוך שרת האינטרנט, אבל מאז זה שרת אינטרנט, זה צריך להיות אפשרי להפעיל אותו ממחשבים אחרים.