الوصول إلى المجلدات المشتركة على خوادم أخرى من تطبيق 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">共有フォルダのあるサーバーを「\\&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,
  }
}

نظرا لأنه يستخدم واجهات برمجة تطبيقات 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 مباشرة.

تأكيد العملية

انقر فوق الزر للتحقق من أنه يعمل دون أي مشاكل. في ما سبق ، يتم الوصول إليه من داخل خادم الويب ، ولكن نظرا لأنه خادم ويب ، يجب أن يكون من الممكن تشغيله من أجهزة كمبيوتر أخرى.