آشنایی با web.config در Asp.net Mvc و Asp.net webforms
9 روز پیش نویسنده: علیرضا بهارلویی

آشنایی با web.config در Asp.net Mvc و Asp.net webforms

بخش هفتم

در مقاله قبلی به فایل startup نسل core پرداختیم و اشاره کریدم که بخشی از تنظیمات startup در نسل های قبلی به فایل کانفیگ برمیگردد.

فایل کانفیگ در اصل تنظیمات مورد نیاز وب را در خود نگهداری میکند. در نسل جدید Core دیدیم که این تنظیمات به زبان سی شارپ نوشته شده است. اما در نسل اول و دوم این کانفیگ به صورت یک فایل xml می باشد.

در این فایل شما قادر خواهید بود تنظیماتی را برای وب سایت خود انجام دهید و همچنین به صورت پیش فرض یکسری از تنظیمات از جمله اسمبلی یا کامپایلر یا بخش ورژن های فریو ورک هایی که استفاده کرده اید موجود است. در اصل این موجودیت برای سیستم وب تعریف شده نه اگاهی دیگران و سیستم اجرایی با مشاهده این  فایل قادر به تشخیص تنظیمات خواهد شد.

قابل ذکر است که بررسی فایل کانفیگ چون به صورت مشترک هستند ما هم در اینجا هر دو را یکجا بررسی خواهیم کرد

وقتی شما فایل کانفیگ در هرکدام از نسل اول یا دوم باز کنید خواهید دید که با چنین تگی شروع شده است.

Configuration این تگ نشانه از تنظیمی بودن فایل مورد نظر می باشد. 

در این فایل ما یک تگی داریم که اشاره به سیستم وب دارد و نشان میدهد که پروژه مورد نظر از خاصیت هایی تحت وب بهره مند شده است.

<system.web> در سیستم وب خواهیم دید که به Framework اشاره شده است همراه با نسخه ای که مورد استفاه قرار گرفته است. پس سیستم متوجه خواهد شد که Frameworkوجود دارد ونسخه آن چند می باشد.

جالب است بدانید که در نسل اول مستقیم به کنترلر مورد نظر که بر پایه webform تعریف شده است در همین اشاره میش<system.web> اشاره میشود. 

نمونه کد  system.web در webforms  

<system.web>
<compilation debug="true" targetFramework="4.7.2"/>
<httpRuntime targetFramework="4.7.2"/>
<pages>
<namespaces>
<add namespace="System.Web.Optimization"/>
</namespaces>
<controls>
<add assembly="Microsoft.AspNet.Web.Optimization.WebForms" namespace="Microsoft.AspNet.Web.Optimization.WebForms" tagPrefix="webopt"/>
</controls>
</pages>
</system.web>

نمونه کد  system.web در asp mvc

<system.web>
    <compilation debug="true" targetFramework="4.7.2"/>
    <httpRuntime targetFramework="4.7.2"/>
</system.web>  

 

همانظور که از کدهای بالا مشاهده میشود تغییر در این دو مورد محسوس می باشد.

قسمت مشترک دیگری که دراین فایل وجود دارد runtime می باشد که برای assembly های مختلف نوشته شده است. اسمبلی هایی که برای ارتباط  با اسمبلی سیستم پیش فرض اجرا تعریف شده همراه با توکن های عمومی.

نمونه ای از این اسمبلی:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
      <dependentAssembly>
        <assemblyIdentity name="Antlr3.Runtime" publicKeyToken="eb42632606e9261f"/>
        <bindingRedirect oldVersion="0.0.0.0-3.5.0.2" newVersion="3.5.0.2"/>
      </dependentAssembly>
    </assemblyBinding>
</runtime>

در ادامه همین اسمبلی ها شاهد دستورات کامپیلری هستیم. کامپیلری برای زبان برنامه نویسی مورد استفاده تعریف شده تا سیستم اجرایی بداند بر چه اساسی باید رفتار کند.

مثلا در این نمونه کد ما از سی شارپ استفاه کرده ایم پس کامیایلر باید اشاره به زبان سی شارپ داشته باشد. اما چون این نسل ها قادر به استفاده از ویژوال بیسیک هم هستند کامپایلر به صورت پیش فرض این مورد را هم اشاره میکند تا سیستم اجرا دچار دوگانگی نشود.

نمونه ای از کد کامپایلر:

<compilers>
  <compiler language="c#;cs;csharp" extension=".cs"
     type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, 
     warningLevel="4" compilerOptions="/langversion:default /nowarn:1659;1699;1701"/>
  <compiler language="vb;vbs;visualbasic;vbscript" extension=".vb"
     type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider,     
</compilers>

همانطور که مشاهده میکنید میبینید که هم سی شارپ اشاره شده است هم ویژوال بیسیک.

تا اینجا این موارد پیش فرض تعریف شده اند اما یک بحث جالب که باید به آن اشاره کرد بحث ارتباط با پایگاه داده است.

در فایل کانفیگ ما میتوانیم مسیر ارتباط با پایگاه را معرفی کنیم تا یک ارتباط ایمن با پایگاه در صورت لزوم برقرار شود.

با استفاده از ConnectionString ای امر صورت میپذیرد.در این تگ چندیدن خاصیت باید در نظرگرفته شود تا ارتباط با پایگاه داده برقرار گردد.با استفاد از یک تگ add  میتوان در ConnectionString پایگاه داده را تعریف کرد.

<add name="ConnectionStringName" providerName="System.Data.SqlClient"
connectionString="Data Source=(LocalDB); InitialCatalog=DatabaseName; 
Integrated Security=True " />

در نمونه کد بالاچند نکته وجود دارد

اول اینکه یک نام برای این تگ در نظر گرفته شده است که به جای ConnectionStringName باید وارد شود.

دوم اینکه در این نمونه از پایگاه داده Sql استفاده شده است. در providerName عینا به این مورد اشاره شده است.

سوم اینکه مسیر ارتباط به صورت یک رشته تعریف شده است. connectionString این مورد می باشد. در این جا نام پایگاه داده و آدرس آن و ایجاد امنیت تعریف شده است.

حال نکته ای جالب را میخواهیم بررسی کنیم در نسل دوم یعنی asp mvc برای صفحات view یک فایل کانفیگ جداگانه تعریف شده است که مربوط به خود view ها می باشد.

در این فایل کانفیگ به تنظیمات razor صفحات اشاره شده است.

<system.web.webPages.razor>
   <pages pageBaseType="System.Web.Mvc.WebViewPage">
     <namespaces>
        <add namespace="System.Web.Mvc" />
        <add namespace="System.Web.Mvc.Ajax" />
        <add namespace="System.Web.Mvc.Html" />
        <add namespace="System.Web.Optimization"/>
        <add namespace="System.Web.Routing" />
        <add namespace="WebApplication6" />
     </namespaces>
   </pages>
</system.web.webPages.razor>

 

در کد بالا مشاهده میکنید که وجود بخش هایی مثل Mvc  یا Ajax و ... در این صفحه وب razor  اشاره شده است.

نکته: این کانفیگ پیش فرض می باشد و مربوط به بخش داخلی وب برمیگردد در حالی که کانفیگ اصلی در روت اصلی و مربوط به بخش تنظیمات کلی سایت است.

 

و اما اخرین مورد. در نسل سوم برای بخش ارتباط دهی با پیاگاه داده از همین connectionString استفاده شده است.

در قسمت قبل فایل startup را مورد بررسی قرار دادیم و الان میبینیم که تنظیماتی که در آن می باشد در فایل کانفیگ دو نسل قبل به جه صورت تعریف شده اند.

 

در این نسل در startup یک معرفی connectionString وجود دارد و بعد با یک کلاس خارجی ارتباط دهی به پایگاه تعریف میشود.

 

در بخش سرویس ها ابتدا تعریف صورت میگیرد.

public void ConfigureServices(IServiceCollection services)
{
  services.AddDbContext<NameContext>(options =>
  options.UseSqlServer(Configuration.GetConnectionString("NameDatabase")));
}

AddDbContext اشاره به کلاس خارجی دارد که باید تعریف شود و اینجا فراخوانی گردد.

 

public class NameContext : DbContext
{

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 {
     optionsBuilder.UseSqlite("DataSource=(LocalDB);InitialCatalog=DatabaseName; 
     Integrated Security=True ");
 }
}

در کد بالا کلاس خارجی تعریف شده است. در این کلاس می بینیم که همانطور که در کانفیگ نسل های قبلی مسیردهی میشد در این نسل هم مسیردهی به همانصورت است.

وجود UseSqlite نشان میدهد که پایگاه مورد استفاده sql می باشد.

در این هفت مقاله که ارائه شد به بررسی ساختار و تفاوت های سه نسل asp.net پرداختیم و دیدیم که چگونه در سه نسل تغییرات رخ داده است. امیدواریم با مطالعه این مقالات به خوبی این نسل ها را شناخته باشید.

 

پایان بخش هفتم