ASP.NET कोर अनुप्रयोग (नेटवर्क कनेक्टेड प्रोग्राम संस्करण) से अन्य सर्वर पर साझा फ़ोल्डरों तक पहुँचना
ऑपरेशन सत्यापन वातावरण
- विजुअल स्टूडियो
-
- विजुअल स्टूडियो 2022
- ASP.NET कोर
-
- 8 (रेजर पेज, एमवीसी)
- विंडोज सर्वर
-
- 2022 (ASP.NET कोर सिस्टम आवश्यकताएँ)
- 2019 (साझा फ़ोल्डर परिनियोजन सर्वर)
- आईआईएस
-
- 10.0
परिचालन का वातावरण
हमने सभी मामलों में इसका परीक्षण नहीं किया है, लेकिन इसे आमतौर पर निम्नलिखित परिस्थितियों में काम करना चाहिए:
- विजुअल स्टूडियो
-
- कुछ भी जो एक ASP.NET कोर परियोजना विकसित कर सकता है
- ASP.NET कोर
-
- कोई भी संस्करण (एमवीसी, रेजर पेज, एपीआई)
- विंडोज सर्वर
-
- Windows Server 2008 या बाद का संस्करण
- आईआईएस
-
- 7.0 या बाद में
पूर्व शर्त
- ASP.NET कोर अनुप्रयोग IIS पर चलाने के लिए अभिप्रेत हैं।
- चूंकि यह प्रमाणीकरण के लिए विंडोज एपीआई का उपयोग करता है, इसलिए यह गैर-विंडोज पर काम नहीं करता है।
पर्यावरण
यह निम्नलिखित वातावरण में सत्यापित है।
पीसी और सर्वर | के उपयोग का उद्देश्य |
---|---|
विंडोज 11 (स्थानीय) | विकासशील कार्यक्रमों के लिए एक वातावरण। |
एसवी2022टेस्ट | एक वातावरण जो IIS और ASP.NET Core चलाता है। यहां से SV2019Test साझा फ़ोल्डर तक पहुंचें |
SV2019टेस्ट | साझा फ़ोल्डरों के साथ सर्वर |
इसके अलावा, विभिन्न सेटिंग्स इस प्रकार हैं।
पैरामीटर नाम | मान |
---|---|
उपयोगकर्ता नाम तक पहुंचें | साझा उपयोगकर्ता |
साझा फ़ोल्डर नाम | साझा फ़ोल्डर |
साझा फ़ोल्डर सर्वर का निर्माण
उपयोगकर्ता बनाना
सामान्य फ़ोल्डर तक पहुँचने के लिए कोई उपयोगकर्ता बनाएँ। इस मामले में, हम एक स्थानीय खाता बनाएंगे, लेकिन यदि आप सक्रिय निर्देशिका जैसे डोमेन में सर्वर और खातों के साथ काम कर रहे हैं, तो आप इसका भी उपयोग कर सकते हैं।
उपयोगकर्ता बनाने की प्रक्रिया इन युक्तियों के दायरे से परे है, इसलिए हम बहुत अधिक विस्तार में नहीं जाएंगे।
SharedUser
इस मामले में, हम इसे नाम से बनाएंगे।
चूंकि यह उपयोगकर्ता स्क्रीन को संचालित नहीं करता है या सेटिंग्स नहीं बदलता है, इसलिए पासवर्ड बदला नहीं जा सकता है।
यदि आप डिफ़ॉल्ट छोड़ देते हैं, तो आप इस उपयोगकर्ता के साथ दूरस्थ डेस्कटॉप आदि के साथ लॉग इन कर सकते हैं, इसलिए कृपया समूह Users
से हटा दें .
साझा फ़ोल्डर बनाना
इससे कोई फर्क नहीं पड़ता कि आप इसे कहां बनाते हैं। ऐसा इसलिए है क्योंकि अन्य सर्वर भौतिक फ़ोल्डर के स्थान की परवाह नहीं करते हैं।
इस मामले में, हम सीधे सी ड्राइव के तहत SharedFolder
नामित एक फ़ोल्डर बनाएंगे और इसे साझा करेंगे।
गुण खोलें और साझाकरण सेटिंग्स कॉन्फ़िगर करें।
साझा फ़ोल्डर का नाम होना चाहिए SharedFolder
। यह नाम अन्य सर्वरों को दिखाई देगा.
अनुमतियों में जोड़ें SharedUser
।
Everyone
मौजूदा हटाएँ.
"बदलें" अनुमति से पुष्टि करें।
चूंकि हमने केवल अनुमतियां जोड़ी हैं जिन्हें बाहर से एक्सेस किया जा सकता है, हम इसे आंतरिक रूप से SharedUser
सेट करेंगे ताकि इस फ़ोल्डर में काम कर सकें।
"बदलें" अनुमति से पुष्टि करें।
कार्रवाई की जाँच करने के लिए एक फ़ाइल बनाएँ। इस प्रोग्राम में, एन्कोडिंग को UFT-8 में संसाधित किया जाता है, इसलिए कृपया इसे UTF-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">共有フォルダのあるサーバーを「\\<サーバー名>」形式で指定します。</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 API का उपयोग करता है और WNetAddConnection2
WNetCancelConnection2
, यह केवल Windows वातावरण में काम करता है।
मेरे पास कुछ समय के लिए एक टिप्पणी है, लेकिन यदि आप अधिक जानना चाहते हैं, तो कृपया इसे इंटरनेट पर देखें।
साझा फ़ोल्डरों के अतिरिक्त, आप नेटवर्क संसाधनों तक पहुँचने के लिए कार्रवाइयाँ भी कर सकते हैं.
इसका उपयोग करना आसान है, और यदि आप निम्न लिखते हैं, तो आप using
दायरे के दौरान साझा फ़ोल्डर तक पहुंच सकते हैं।
using (new SharedFolderAccessor($@"\\{serverName}", credentials))
{
// この間は共有フォルダにアクセスできる
}
हालांकि, वास्तव WNetCancelConnection2
में, कॉलिंग के समय कनेक्शन तुरंत डिस्कनेक्ट नहीं होता है , इसलिए using
आप दायरे के बाद भी साझा फ़ोल्डर तक पहुंच सकते हैं।
SharedFolderAccessor का उपयोग करके टेस्ट कोड
चूंकि साझा फ़ोल्डर तक पहुंचने की प्रक्रिया ढांचे पर निर्भर नहीं करती है, इसलिए हम परीक्षण के लिए एक सामान्य विधि बनाते हैं जो फ़ाइलों को पढ़ता और लिखता है। Pazor Pages और 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();
}
}
}
}
इंडेक्स.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>
@* ここまで追加 *@
एमवीसी
इसी तरह, एमवीसी के मामले में, 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 सेवा की आवश्यकता नहीं है।
ASP.NET कोर रनटाइम होस्टिंग बंडल इंस्टालेशन
चूंकि हम ASP.NET कोर 8 का उपयोग कर रहे हैं, इसलिए हमें तदनुसार रनटाइम स्थापित करने की आवश्यकता है। इसे निम्न URL से डाउनलोड करें:
आईआईएस में ASP.NET कोर चलाने के लिए, आपको "होस्टिंग बंडल" नामक कुछ चाहिए। ASP.NET कोर रनटाइम से "होस्टिंग बंडल" डाउनलोड करें।
एक बार डाउनलोड हो जाने के बाद, इसे सर्वर पर चलाएं।
इसे स्थापित करने के लिए विज़ार्ड का अनुसरण करें.
अपना प्रोग्राम प्रकाशित करें
IIS के लिए Visual Studio से किसी फ़ाइल के रूप में परिनियोजित करने के लिए इच्छित प्रोग्राम आउटपुट करें।
इसे विंडोज के लिए संशोधित करें।
जब आप कर लें तो प्रकाशित करें।
यदि आप लक्ष्य स्थान पर क्लिक करते हैं, तो आप उस फ़ोल्डर को खोल सकते हैं जहां प्रकाशित फ़ाइल स्थित है।
आपको उन सभी को लाने की ज़रूरत नहीं है, लेकिन यदि आप निश्चित नहीं हैं, तो आप उन सभी को अभी के लिए ले सकते हैं। इस बिंदु पर, आपको केवल यह सुनिश्चित करना है कि फ़ाइल मौजूद है।
वेब अनुप्रयोग बनाना और परिनियोजित करना
Windows व्यवस्थापकीय उपकरण से, इंटरनेट सूचना सेवाओं (IIS) प्रबंधक खोलें।
हम एक साइट बनाएंगे, लेकिन इस बार हम "डिफ़ॉल्ट वेब साइट" का उपयोग करेंगे जो शुरुआत से ही है।
डिफ़ॉल्ट वेब साइट चयनित होने के साथ, फ़ोल्डर खोलने के लिए Explorer क्लिक करें. प्रकाशित कार्यक्रम को कॉपी करें यहाँ उत्पन्न करें. आप मूल फ़ाइल को हटा सकते हैं।
आईआईएस लिंक से पृष्ठ खोलें और देखें कि स्क्रीन दिखाई देती है या नहीं। आप पहले एक वेब ब्राउज़र खोल सकते हैं और सीधे URL दर्ज कर सकते हैं।
संचालन की पुष्टि
यह सत्यापित करने के लिए बटन क्लिक करें कि यह बिना किसी समस्या के काम करता है। उपरोक्त में, इसे वेब सर्वर के भीतर से एक्सेस किया जाता है, लेकिन चूंकि यह एक वेब सर्वर है, इसलिए इसे अन्य पीसी से संचालित करना संभव होना चाहिए।