الوصول إلى المجلدات المشتركة على خوادم أخرى من تطبيق ASP.NET Core (إصدار البرنامج المتصل بالشبكة)
بيئة التحقق من العملية
- فيجوال ستوديو
-
- فيجوال ستوديو 2022
- ASP.NET الأساسية
-
- 8 (صفحات الحلاقة ، MVC)
- خادم ويندوز
-
- 2022 (ASP.NET متطلبات النظام الأساسية)
- 2019 (خادم نشر المجلد المشترك)
- IIS
-
- 10.0
بيئة التشغيل
لم نختبره في جميع الحالات ، ولكن يجب أن يعمل بشكل عام في ظل الظروف التالية:
- فيجوال ستوديو
-
- أي شيء يمكن أن يطور مشروعا أساسيا ASP.NET
- ASP.NET الأساسية
-
- أي إصدار (MVC ، صفحات الحلاقة ، API)
- خادم ويندوز
-
- ويندوز سيرفر 2008 أو أحدث
- IIS
-
- 7.0 أو أحدث
الشرط المسبق
- تهدف تطبيقات ASP.NET Core إلى التشغيل على IIS.
- نظرا لأنه يستخدم واجهات برمجة تطبيقات Windows للمصادقة ، فإنه لا يعمل على غير Windows.
وسط
يتم التحقق منه في البيئة التالية.
الغرض من استخدام | أجهزة الكمبيوتر والخوادم |
---|---|
ويندوز 11 (محلي) | بيئة لتطوير البرامج. |
SV2022اختبار | بيئة تقوم بتشغيل IIS و ASP.NET Core. قم بالوصول إلى المجلد المشترك SV2019Test من هنا |
SV2019اختبار | الخوادم ذات المجلدات المشتركة |
بالإضافة إلى ذلك ، الإعدادات المختلفة هي كما يلي.
قيمة | اسم المعلمة |
---|---|
الوصول إلى اسم المستخدم | مستخدم مشترك |
اسم المجلد المشترك | المجلد المشترك |
إنشاء خادم مجلد مشترك
إنشاء مستخدم
إنشاء مستخدم للوصول إلى المجلد المشترك. في هذه الحالة ، سنقوم بإنشاء حساب محلي ، ولكن إذا كنت تتعامل مع خوادم وحسابات في مجال مثل Active Directory ، فيمكنك استخدام ذلك أيضا.
عملية إنشاء مستخدم خارج نطاق هذه النصائح ، لذلك لن ندخل في الكثير من التفاصيل.
SharedUser
في هذه الحالة ، سنقوم بإنشائه بالاسم .
نظرا لأن هذا المستخدم لا يقوم بتشغيل الشاشة أو تغيير الإعدادات ، فلا يمكن تغيير كلمة المرور.
إذا تركت الإعداد الافتراضي ، فيمكنك تسجيل الدخول باستخدام هذا المستخدم باستخدام Remote Desktop ، وما إلى ذلك ، لذا يرجى الإزالة من المجموعة Users
.
إنشاء مجلد مشترك
لا يهم مكان إنشائه. وذلك لأن الخوادم الأخرى لا تهتم بموقع المجلد الفعلي.
في هذه الحالة ، سنقوم بإنشاء مجلد باسم مباشرة تحت SharedFolder
محرك الأقراص C ومشاركته.
افتح الخصائص وقم بتكوين إعدادات المشاركة.
يجب أن SharedFolder
يكون اسم المجلد المشترك . سيكون هذا الاسم مرئيا للخوادم الأخرى.
أضف SharedUser
الأذونات.
Everyone
حذف ملف .
قم بالتأكيد باستخدام إذن "التغيير".
نظرا لأننا أضفنا فقط أذونات يمكن الوصول إليها من الخارج ، فسنقوم بتعيينها داخليا SharedUser
بحيث يمكن تشغيلها في هذا المجلد.
قم بالتأكيد باستخدام إذن "التغيير".
قم بإنشاء ملف للتحقق من العملية. في هذا البرنامج ، تتم معالجة الترميز في UFT-8 ، لذا يرجى حفظه في UTF-8.
لا بأس إذا كان بإمكانك الوصول إلى Explorer من \\<サーバー名>\
جهاز كمبيوتر آخر ، وتسجيل الدخولSharedUser
باستخدام ، وعرض الملف.
إنشاء برنامج لقراءة الملفات وكتابتها من مجلد مشترك من تطبيق ASP.NET Core
عملية السيد / السيدة هي النقر فوق الزر.
- تحميل الملفات في مجلد مشترك وعرضها على الشاشة
- كتابة ملف جديد إلى مجلد مشترك
عملية.
تعد Razor Pages ورمز MVC أمثلة على ذلك ، لكن البرنامج الذي يصل إلى المجلد المشترك هو نفسه لكليهما. وينطبق الشيء نفسه على واجهات برمجة تطبيقات الويب. إذا كان هناك أي شيء ، فيجب أن يعمل في برنامج العميل أيضا.
عملية تتصل بشبكة طوال مدة عملية معينة
قم بإنشاء التعليمة البرمجية التالية في أي مكان في مشروعك. اسم الفئة هو 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,
}
}
نظرا لأنه يستخدم واجهات برمجة تطبيقات Win32 و WNetAddConnection2
WNetCancelConnection2
، فإنه يعمل فقط في بيئة Windows.
لدي تعليق في الوقت الحالي ، ولكن إذا كنت تريد معرفة المزيد ، فيرجى البحث عنه على الإنترنت.
بالإضافة إلى المجلدات المشتركة ، يمكنك أيضا إجراء عمليات للوصول إلى موارد الشبكة.
إنه سهل الاستخدام ، وإذا كتبت ما يلي ، يمكنك using
الوصول إلى المجلد المشترك أثناء النطاق.
using (new SharedFolderAccessor($@"\\{serverName}", credentials))
{
// この間は共有フォルダにアクセスできる
}
ومع ذلك ، في الواقع WNetCancelConnection2
، لا يتم قطع الاتصال على الفور في وقت الاتصال ، حتى using
تتمكن من الوصول إلى المجلد المشترك حتى بعد النطاق.
رمز الاختبار باستخدام شاريد فولدرأكسسيسور
نظرا لأن عملية الوصول إلى المجلد المشترك لا تعتمد على إطار العمل ، فإننا ننشئ طريقة شائعة للاختبار تقرأ الملفات وتكتبها. يجب تسمية صفحات 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 ، وانقر فوقه ، وقم بتشغيل رمز الاختبار ، وعرض النتائج على الشاشة. في بعض الحالات ، قد لا يمكن الوصول إلى المجلد المشترك ، لذلك يتم تضمينه في محاولة صيد.
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 ، 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 تثبيت حزمة استضافة وقت التشغيل الأساسية
نظرا لأننا نستخدم ASP.NET Core 8 ، نحتاج إلى تثبيت وقت التشغيل وفقا لذلك. قم بتنزيله من عنوان URL التالي:
لتشغيل ASP.NET Core في IIS ، تحتاج إلى شيء يسمى "حزمة الاستضافة". قم بتنزيل "حزمة الاستضافة" من وقت التشغيل الأساسي ASP.NET.
بمجرد التنزيل ، قم بتشغيله على الخادم.
اتبع المعالج لتثبيته.
انشر برنامجك
إخراج البرنامج الذي تريد نشره إلى IIS كملف من Visual Studio.
قم بتعديله لنظام التشغيل Windows.
انشر عند الانتهاء.
إذا قمت بالنقر فوق الموقع المستهدف ، يمكنك فتح المجلد حيث يوجد الملف المنشور.
ليس عليك إحضارها جميعا ، ولكن إذا لم تكن متأكدا ، فيمكنك أخذها جميعا في الوقت الحالي. في هذه المرحلة ، كل ما عليك فعله هو التأكد من وجود الملف.
إنشاء تطبيقات الويب ونشرها
من أدوات إدارية ل Windows، افتح إدارة خدمات معلومات إنترنت (IIS).
سنقوم بإنشاء موقع ، ولكن هذه المرة سنستخدم "موقع الويب الافتراضي" الموجود منذ البداية.
مع تحديد موقع ويب الافتراضي، انقر فوق مستكشف لفتح المجلد. انسخ البرنامج المنشور هنا. يمكنك حذف الملف الأصلي.
افتح الصفحة من ارتباط IIS ومعرفة ما إذا كانت الشاشة تظهر. يمكنك فتح متصفح الويب أولا وإدخال عنوان URL مباشرة.
تأكيد العملية
انقر فوق الزر للتحقق من أنه يعمل دون أي مشاكل. في ما سبق ، يتم الوصول إليه من داخل خادم الويب ، ولكن نظرا لأنه خادم ويب ، يجب أن يكون من الممكن تشغيله من أجهزة كمبيوتر أخرى.