ASP.NET کور ایپلی کیشن (نیٹ ورک کنیکٹڈ پروگرام ورژن) سے دوسرے سرورز پر مشترکہ فولڈرز تک رسائی حاصل کرنا

جب صفحے کی تازہ کاری :
صفحہ تخلیق تاریخ :

آپریشن تصدیق کا ماحول

Visual Studio
  • Visual Studio 2022
ASP.NET کور
  • 8 (ریزر پیجز، ایم وی سی)
Windows Server
  • 2022 (بنیادی نظام کی ضروریات ASP.NET)
  • 2019 (مشترکہ فولڈر تعیناتی سرور)
IIS
  • 10.0

آپریٹنگ ماحول

ہم نے تمام معاملات میں اس کی جانچ نہیں کی ہے، لیکن یہ عام طور پر مندرجہ ذیل شرائط کے تحت کام کرنا چاہئے:

Visual Studio
  • کوئی بھی چیز جو ایک ASP.NET کور پروجیکٹ تیار کر سکتی ہے
ASP.NET کور
  • کسی بھی ورژن (ایم وی سی، ریزر صفحات، اے پی آئی)
Windows Server
  • ونڈوز سرور 2008 یا اس کے بعد
IIS
  • 7.0 یا اس کے بعد

پیشگی شرائط

  • ASP.NET کور ایپلی کیشنز کا مقصد آئی آئی ایس پر چلنا ہے۔
  • چونکہ یہ تصدیق کے لئے ونڈوز اے پی آئی استعمال کرتا ہے ، لہذا یہ غیر ونڈوز پر کام نہیں کرتا ہے۔

ماحول

اس کی تصدیق مندرجہ ذیل ماحول میں کی جاتی ہے۔

پی سی اور سرورز کے استعمال کا مقصد
ونڈوز 11 (مقامی) پروگراموں کی ترقی کے لئے ایک ماحول.
SV2022Test ایک ایسا ماحول جو آئی آئی ایس اور ASP.NET کور چلاتا ہے۔ یہاں سے SV2019 ٹیسٹ مشترکہ فولڈر تک رسائی حاصل کریں
SV2019Test مشترکہ فولڈرز والے سرورز

اس کے علاوہ، مختلف ترتیبات مندرجہ ذیل ہیں.

پیرامیٹر نام کی قدر
صارف نام تک رسائی حاصل کریں SharedUser
مشترکہ فولڈر کا نام SharedFolder

مشترکہ فولڈر سرور کی تعمیر

ایک صارف بنائیں

عام فولڈر تک رسائی حاصل کرنے کے لئے صارف بنائیں۔ اس صورت میں ، ہم ایک مقامی اکاؤنٹ بنائیں گے ، لیکن اگر آپ کسی ڈومین جیسے فعال ڈائریکٹری میں سرورز اور اکاؤنٹس کے ساتھ کام کر رہے ہیں تو ، آپ اسے بھی استعمال کرسکتے ہیں۔

صارف بنانے کا عمل ان تجاویز کے دائرہ کار سے باہر ہے ، لہذا ہم بہت زیادہ تفصیل میں نہیں جائیں گے۔

SharedUser اس صورت میں، ہم اسے نام کے ساتھ بنائیں گے. چونکہ یہ صارف اسکرین کو نہیں چلاتا یا ترتیبات کو تبدیل نہیں کرتا ہے ، لہذا پاس ورڈ کو تبدیل نہیں کیا جاسکتا ہے۔

اگر آپ ڈیفالٹ چھوڑ دیتے ہیں تو ، آپ ریموٹ ڈیسک ٹاپ وغیرہ کے ساتھ اس صارف کے ساتھ لاگ ان کرسکتے ہیں ، لہذا براہ کرم گروپ Users سے ہٹا دیں۔

ایک مشترکہ فولڈر بنانا

اس سے کوئی فرق نہیں پڑتا کہ آپ اسے کہاں بناتے ہیں. اس کی وجہ یہ ہے کہ دوسرے سرورز جسمانی فولڈر کے مقام کی پرواہ نہیں کرتے ہیں۔ اس صورت میں ، ہم سی ڈرائیو کے تحت SharedFolder براہ راست نام کا ایک فولڈر بنائیں گے اور اس کا اشتراک کریں گے۔

خصوصیات کو کھولیں اور شیئرنگ کی ترتیبات تشکیل دیں۔

مشترکہ فولڈر کا نام ہونا چاہئے SharedFolder ۔ یہ نام دوسرے سرورز کو نظر آئے گا۔ اجازتیں شامل کریں SharedUser ۔

Everyone موجودہ کو حذف کریں۔

"تبدیل کریں" اجازت کے ساتھ تصدیق کریں۔

چونکہ ہم نے صرف ایسی اجازتیں شامل کی ہیں جن تک باہر سے رسائی حاصل کی جاسکتی ہے ، لہذا ہم اسے اندرونی طور پر SharedUser ترتیب دیں گے تاکہ اس فولڈر میں کام کرسکیں۔

"تبدیل کریں" اجازت کے ساتھ تصدیق کریں۔

آپریشن کو چیک کرنے کے لئے ایک فائل بنائیں۔ اس پروگرام میں ، انکوڈنگ کو یو ایف ٹی -8 میں پروسیس کیا جاتا ہے ، لہذا براہ کرم اسے یو ٹی ایف -8 میں محفوظ کریں۔

اگر آپ کسی دوسرے پی سی سے \\<サーバー名>\ ایکسپلورر میں رسائی حاصل کرسکتے ہیں ، لاگ ان کرسکتے ہیںSharedUser ، اور فائل دیکھ سکتے ہیں تو یہ ٹھیک ہے۔

ASP.NET کور ایپلی کیشن سے مشترکہ فولڈر سے فائلوں کو پڑھنے اور لکھنے کے لئے ایک پروگرام بنائیں

مسٹر / مس آپریشن بٹن پر کلک کرنا ہے۔

  • فائلوں کو مشترکہ فولڈر میں لوڈ کریں اور انہیں اسکرین پر ڈسپلے کریں۔
  • مشترکہ فولڈر میں ایک نئی فائل لکھیں

عمل.

ریزر پیجز اور ایم وی سی کوڈ اس کی مثالیں ہیں ، لیکن مشترکہ فولڈر تک رسائی حاصل کرنے والا پروگرام دونوں کے لئے یکساں ہے۔ ویب اے پی آئی کے لئے بھی ایسا ہی ہے۔ اگر کچھ بھی ہے تو ، اسے کلائنٹ پروگرام میں بھی کام کرنا چاہئے۔

ایک عمل جو کسی مخصوص عمل کی مدت کے لئے نیٹ ورک سے جڑتا ہے

اپنے پروجیکٹ میں کہیں بھی درج ذیل کوڈ بنائیں۔ کلاس کا نام ہے 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,
  }
}

چونکہ یہ ون 32 اے پی آئی استعمال کرتا ہے اور WNetAddConnection2 WNetCancelConnection2 ، یہ صرف ونڈوز ماحول میں کام کرتا ہے۔ فی الحال میرے پاس ایک تبصرہ ہے، لیکن اگر آپ مزید جاننا چاہتے ہیں تو، براہ مہربانی اسے انٹرنیٹ پر دیکھیں. مشترکہ فولڈرز کے علاوہ ، آپ نیٹ ورک کے وسائل تک رسائی حاصل کرنے کے لئے کارروائیاں بھی انجام دے سکتے ہیں۔

اسے استعمال کرنا آسان ہے ، اور اگر آپ مندرجہ ذیل لکھتے ہیں تو ، آپ using دائرہ کار کے دوران مشترکہ فولڈر تک رسائی حاصل کرسکتے ہیں۔

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

تاہم ، حقیقت WNetCancelConnection2 میں ، کال کے وقت کنکشن فوری طور پر منقطع نہیں ہوتا ہے ، لہذا using آپ دائرہ کار کے بعد بھی مشترکہ فولڈر تک رسائی حاصل کرسکتے ہیں۔

مشترکہ فولڈر ایکسیسر کا استعمال کرتے ہوئے ٹیسٹ کوڈ

چونکہ مشترکہ فولڈر تک رسائی کا عمل فریم ورک پر منحصر نہیں ہے ، لہذا ہم ٹیسٹنگ کے لئے ایک عام طریقہ بناتے ہیں جو فائلوں کو پڑھتا اور لکھتا ہے۔ پازور پیجز اور ایم وی سی کو ایک ہی کہا جانا چاہئے۔

مواد ایک ایسا عمل ہے جو مشترکہ فولڈر میں استدلال میں منتقل کردہ متن کو لکھتا ہے ، مشترکہ فولڈر میں پہلے سے موجود ٹیکسٹ فائل کو پڑھتا ہے ، اور متن واپس کرتا ہے۔

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.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 انسٹال کریں

سرور مینیجر سے ڈیفالٹ طور پر اسے انسٹال کریں۔ میں طریقہ کار کی تفصیل میں نہیں جاؤں گا۔

کوئی اضافی خصوصیات کی ضرورت نہیں ہے.

اس وقت کسی اضافی آئی آئی ایس خدمات کی ضرورت نہیں ہے۔

ASP.NET کور رن ٹائم ہوسٹنگ بنڈل انسٹالیشن

چونکہ ہم ASP.NET کور 8 استعمال کر رہے ہیں ، لہذا ہمیں اس کے مطابق رن ٹائم انسٹال کرنے کی ضرورت ہے۔ اسے درج ذیل URL سے ڈاؤن لوڈ کریں:

آئی آئی ایس میں ASP.NET کور چلانے کے لئے ، آپ کو "ہوسٹنگ بنڈل" نامی کسی چیز کی ضرورت ہے۔ ASP.NET کور رن ٹائم سے "ہوسٹنگ بنڈل" ڈاؤن لوڈ کریں۔

ایک بار ڈاؤن لوڈ ہونے کے بعد ، اسے سرور پر چلائیں۔

اسے انسٹال کرنے کے لئے وزارڈ کی پیروی کریں۔

اپنا پروگرام شائع کریں

وہ پروگرام آؤٹ پٹ کریں جسے آپ بصری اسٹوڈیو سے فائل کے طور پر IIS پر تعینات کرنا چاہتے ہیں۔

ونڈوز کے لئے اس میں ترمیم کریں۔

کام مکمل ہونے پر شائع کریں۔

اگر آپ ہدف کے مقام پر کلک کرتے ہیں تو ، آپ وہ فولڈر کھول سکتے ہیں جہاں شائع شدہ فائل واقع ہے۔

آپ کو ان سب کو لانے کی ضرورت نہیں ہے، لیکن اگر آپ کو یقین نہیں ہے تو، آپ ان سب کو ابھی کے لئے لے جا سکتے ہیں. اس موقع پر ، آپ کو صرف اس بات کو یقینی بنانے کی ضرورت ہے کہ فائل موجود ہے۔

ویب ایپلی کیشنز بنانا اور تعینات کرنا

ونڈوز ایڈمنسٹریٹو ٹولز سے ، انٹرنیٹ انفارمیشن سروسز (آئی آئی ایس) مینیجر کھولیں۔

ہم ایک سائٹ بنائیں گے ، لیکن اس بار ہم "ڈیفالٹ ویب سائٹ" استعمال کریں گے جو شروع سے موجود ہے۔

طے شدہ ویب سائٹ منتخب ہونے کے ساتھ ، فولڈر کھولنے کے لئے ایکسپلورر پر کلک کریں۔ شائع شدہ پروگرام کو یہاں کاپی کریں۔ آپ اصل فائل کو حذف کرسکتے ہیں۔

آئی آئی ایس لنک سے صفحہ کھولیں اور دیکھیں کہ آیا اسکرین ظاہر ہوتی ہے یا نہیں۔ آپ پہلے ویب براؤزر کھول سکتے ہیں اور براہ راست یو آر ایل داخل کرسکتے ہیں۔

آپریشن کی تصدیق

اس بات کی تصدیق کرنے کے لئے بٹن پر کلک کریں کہ یہ بغیر کسی مسئلے کے کام کرتا ہے۔ مندرجہ بالا میں ، اس تک ویب سرور کے اندر سے رسائی حاصل کی جاتی ہے ، لیکن چونکہ یہ ایک ویب سرور ہے ، لہذا اسے دوسرے پی سی سے چلانا ممکن ہونا چاہئے۔