Asp.net MVC Action Kontrolü ve Action Attribute

25 Ağu

Bu bölümde controller sınıfımızdaki action metodları nasıl kontrol edilebileceği vebu metodlara erişim izinlerini belirleyen ve bu metodları bir anlamda özelleştiren bazı attribute’lerden bahsedeceğiz. İnceleyeceğimiz bazı attribute’ler:

  • AcceptVerbs
  • ActionName
  • ActionMethodSelector

AcceptVerbs Attribute

Bu attribute action metoduna HTTP operasyonları yardımıyla erişme izinlerini belirler. Bir action metoduna sadece HTTP Get metoduyla ya da Post metoduyla erişilmesini isteyebiliriz. Bu durumda ilgili action metodumuz AcceptVerbs attribute ile işaretlememiz gerekecektir.

Bir employee controller sınıfımıza ait Create() metodu olduğunu varsayacak olursak bu noktada iki adet Create() action metoduna ihtiyacımız olacaktır. Birinci metod HTTP GET operasyonu ile metodu ile çağrılmalı ve form sayfasını karşımıza çıkarmalı, ikinci metod ise form doldurulduktan sonra HTTP POST metodu ile verilerin alınarak işlenmesini sağlayacaktır.

// GET: /Employee/Create

[AcceptVerbs(HttpVerbs.Get)]

public ActionResult Create()

{

return View();

}
// POST: /Employee/Create

[AcceptVerbs(HttpVerbs.Post)]

public ActionResult Create(Employee employeeToCreate)

{

try

{

//Kayıtları yap…

return RedirectToAction(“Index”);

}

catch

{

return View();

}

}

Bu durumda bowser ortamından /Employee/Create şeklinde çağırdığımızda eğer controller oluşturulmamışsa hata raporu gözükecektir.

The resource cannot be found.

Description: HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly.

Requested URL: /Employee/Create

Bu hatanın sebebi, henüz Employee adında controller oluşturulmamış olmasıdır.

Employee adında bir Controller oluşturulduktan sonra ve bir Create action metod oluşturulursa sorun çözülmüş olacaktır.

Action metodlarını HTTP operasyonlarıyla işaretlemenin bir diğer yolu ise aşağıdaki şekildedir. [AcceptVerbs(HttpVerbs.Post)] yazımının kısa yazılmış şeklidir.

        [HttpGet]
public ActionResult MyAction()

{

return View();

}

Bu metod daha kullanışlıdır. Hazır oluşturulmuş attributeler yazdımıyla işaretlemeler yapılmaktadır.

HTTP operasyonlarından en çok bilinen POST ve GET operasyonlarıdır. Diğer operasyonlar DELETE, PUT, HEAD, TRACE, CONNECT.

Asp.net MVC 4 Yol Haritası

24 Ağu

Microsoft ASP.NET MVC 4 Yol haritasını yayınladı. Tabi bu yol haritası üzerinde değişklikler yapılabilmesi muhtemel geçici bir bakış açısı gibi duruyor. Bu yol haritasında dikkat çekici üç hazırlık mevcut. Bunlar yeni araçlar (tooling), genişletilmiş mobil platform desteği ve bulut tabanlı (cloud based) çözümler.

ASP.NET MVC takımındaki bir diğer çalışma ise Genişletilebilir Görev Tabanlı Araçlar (Recipes = (Extensible Task-Based Tooling). Örneğin view katamnında bir datagridi doldurup göstermek için önce data-access sınıfları hazırlanır, sonra controller tarafında veriler bir model doldurulur ve view katmanına sunulur. Bu çözümler (Recieps) denilen araçlar bu işlemlere yardım edecek. Kullanıcılar kendi çözümlerini de kendileri yazabilecekler. Yazılan çözümler bir arayüz vasıtası ile uygulamaya dahil edilebiliyor olacak.

Smartphone ve tablet tarafından olaya baktığımızda Microsoft ASP.NET MVC takımı template vb. yöntemlerle ASP.NET MVC 4 web sayfalarının mobil versiyonuna daha iyi destek vermeyi düşünüyor. Aşağıda MVC3 ve MVC4 ile yapılmış web sitelerinin mobil ortamda görüntülerini incelediğimizde farkı daha iyi anlamış olacağız.


Ele alınan bir başka değişiklik ise özellikle tablet ve mobil cihazlar için yeni bir proje şablonu. Bu şablonun da görünümü yine aşağıdaki gibi olacak:


Tabi bu kadarla da kalmayıp aygıta göre View oluşturma imkanı da gelen yeni yenilikler arasında. Örneğin mobil aygıtlar için oluşturulan bir View .mobile uzantılı olacak. Aşağıdaki resimde view katmanının görünümü verilmiştir:

Asp.net MVC ve ELMAH ile Hata Log Kaydı

22 Ağu

Web uygulamalarımızı yaparken tüm kontrol elimizde olsun isteriz. Kontrol etmek istediğimiz noktalardan birisi de süreç işlerken oluşan hataların neler olduğudur. Yani bir kullanıcı sistemde işlem yaparken bir hata ile karşılaştığında işleminin neden yarıda kesildiğinden haberdar olmak isteriz. Yazdığımız kodlardaki bug’lar olsun, sunucu kaynaklı sorunlar olsun sorunun ne olduğu, ne zaman meydana geldiği hatta hangi kullanıcının bu sorunu yaşadığı kaydedip incelemek istediğimiz durumlardır.

Bu noktada yazılmış hata yöneticilerinden biri de ELMAH (Error Logging Modules and Handlers) kütüphanesidir. Bu kütüphane süreç işlerken oluşan hataları detaylı olarak kaydeder.

Oluşan Log kayıtlarını birçok ortamda depolayabiliriz. Bu depolama ortamları:

Burada dikkat etmemiz gereken noktalardan biri oluşan hata loglarını nereye kaydedeceğimizi belirlemektir. Biz kayıtları XML dosyada tutacağız.

ASP.NET MVC projesine ELMAH kütüphanesini dahil etmek için Nuget Package Manager eklentisini kullanıyor olacağız.

Package Manager Console açarak Install-Package elmah.xml komutunu giriyoruz. Kurulum otomatik olarak gerçekleşiyor. Web.config dosyası içerisinde ayarlamalar otomatik olarak yapılıyor. Hata kayıtlarının nerede tutulacağını belirleyen kısım ise aşağıdaki gibidir.

  <elmah>   
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data/Elmah.Errors" />
  </elmah>

Yükleme işlemi gerçekleştikten sonra HomeController içersine About adında bir index belirliyoruz ve bu metodun hata fırlatmasını sağlıyoruz.

 

http://localhost:1735/Home/About şeklinde çağırdığımızda meşur sarı hata sayfasıyla karşılaşıyoruz. (1735 portu kendi makinamın verdiği port numarası, sizin denemenizde bu numara farklı olabilir.)

Bu hata kaydı  App_Data/Elmah.Errors dizininde XML dosya içersine kaydedilmiş olacak. Hata kaydını görmek için http://localhost:1735/elmah.axd yoluna bakıyoruz ve aşağıdaki şekilde başarılı sonuca ulaşmış oluyoruz.

Global.asax Applicarion_End, Applicarion_Start, Session_End, Session_Start

22 Ağu

Global.asx dosyası içinde oturum açıldığı ve kapandığı sırada ya da uygulama ayağa kalktığında veya sonlandığında gerçekleşen ve açıklanmayı bekleyen bazı olaylar vardır. Bunlardan birkaçını açıklamaya çalışalım.

protected void Application_Start()

{

System.Diagnostics.Debug.WriteLine(“Application_started”);

 

AreaRegistration.RegisterAllAreas();

 

RegisterRoutes(RouteTable.Routes);

}

 

protected void Session_End(object sender, EventArgs e)

{

System.Diagnostics.Debug.WriteLine(“Session_End”);

}

 

protected void Session_Start(object sender, EventArgs e)

{

System.Diagnostics.Debug.WriteLine(“Session_Start”);

}

 

protected void Application_End()

{

System.Diagnostics.Debug.WriteLine(“Application_ended”);

}

 

Application_Start() metodu uygulama ilk çalıştırıldığında tetiklenecektir. Yani uygulamanın ApplicationDomain’i yaratıldığında oluşturulur. Her .Net Process’i default olarak bir tane Application domain’i içerir; bu application domain CLR tarafından işlemin başlatılması ile otomatik olarak yaratılır.

Application_End() metodu uygulama son bulduğunda tetiklenecektir.         Yani uygulamamız ApplicationDomain’den çıkarıldığında çalışacaktır.

Session_Start() metodu uygulamamıza bir istek geldiğinde tetiklenecektir. Daha basit bir anlatımla kullanıcı siteye girdiğinde çalışacaktır.

Session_End() metodunu kullanıcı hareketleriyle yakalamak imkansızdır. Yani kullanıcı siteye girdi ve browser’ı kapattı. Browser kapandığında Session_End metodu çalışmaz. Çünkü browser kapanması sunucuya bir istek göndermeyecek. Dolayısıyla istek olmadığı için cevapta olmayacaktır. Bir session server tarafında varsayılan olarak 20 dakika tutulur. Kullanıcı 20 dakika boyunca hiçbir işlem yapmazssa session otomatik olarak sonlandırılır ve Session_End() metodu çalışır.

Asp.net MVC Handling Unknown Actions

22 Ağu

Bu yazımızda controller sınıfımızdaki action metodları içinde bulunmayan bir action çağrıldığında bu çağrıyı yakalayıp duruma göre kullanıcıya mesaj verme işleminin nasıl yapılacağı konusuna değiniyor olacağız.

Controller sınıfları HandleUnknownAction() adında protected bir metoda sahiptir.

protected virtual void HandleUnknownAction(string actionName);

Bu metod bir action metodu çağrıldığında eğer istenen action bulunamazssa otomatik olarak devreye girer.örneğin browser üzerinden (/Product/olmayanMetod ) şeklinde olmayan bir action çağrıldığında HandleUnknownAction() metodu çalışacaktır.

Normalde olmayanMetod çağrıldığında metod 404 hatası fırlatmalıdır. Ancak biz HandleUnknownAction() metodunu ezerek kullanıcıya düzgün mesaj bildirimleri ile hataları gösterebiliriz. Özel oluşturduğumuz hata sayfasına yönlendirebiliriz.

    [HandleError]

public class HomeController : Controller

{

public ActionResult Index()       {

ViewData[“Message”] = “Welcome to ASP.NET MVC!”;

return View();

}

protected override void HandleUnknownAction(string actionName)

{

ViewData[“actionName”] = actionName;

View(“Unknown”).ExecuteResult(this.ControllerContext);

}

}

 

Upgrading Entity Framework 4.1 RC

22 Ağu

Entity Framework 4.1 RC yayınlandı ve eski sürümlerin bu sürüme yükseltilmesi faydalı olacaktır. Bu sürümde bazı küçük hatalar(bug) da giderilmiştir.

EF 4.1 RC  Upgrade sırasında izlenecek yöntem

  1. NuGet konsola uninstall-package EFCodeFirst yazarak eski paketi kaldırılır.
  2. NuGet konsola install-package EntityFramework yazarak yeni sürümü yüklenir.
  3. Birkaç satır kod ile CTP 5 sürümünden RC sürümüne geçiş sağlanır.

1. Uninstall Entity Framework 4.1 CTP 5

NuGet Package Manager eklentisi yüklü değilse buradan edinebilirsiniz.

  • İlk olarak  NuGet Package Manager Console açılarak yola çıkılır:
  • Package Manager penceresinde açılır listede(dropdown list) doğru projenin seçili olduğundan emin olunur.
  • Konsola uninstall-package EFCodeFirst yazarak ENTER tuşuna basılır.
  • View –> Other Windows –> Package Manager Console

Alternatif bir yöntem ise form arayüz (UI) ile NuGet paketin kaldırılmasıdır. Alternatif yol şu şekildedir.

  1. Projeye sağ tıklayarak Add Library Package Reference seçimi yapılır.
  2. Sol menüden Installed Packages seçilir
  3. Uninstall butonuna basarak EFCodeFirst paketi kaldırılır.

2.  Entity Framework 4.1 RC sürümünün NuGet ile yüklenmesi

EF 4.1 RC kurulumu yükleme dosyasını indirerekte kurulabilir fakat NuGet çok daha basit.

  • İlk olarak NuGet Package Manager Console açılarak başlanır. Konsolu açmak için şu yol izlenir:
  • Package Manager penceresinde açılır listede(dropdown list) doğru projenin seçili olduğundan emin olunur.
  • install-package EntityFramework komutu girilerek ENTER tuşuna basılır.
  • View –> Other Windows –> Package Manager Console

Alternatif bir yöntem ise form arayüz (UI) ile NuGet paketin yüklenmesidir. Alternatif yol şu şekildedir.

  1. Projeye sağ tıklayarak Add Library Package Reference seçilir.
  2. Sol menüden Online seçeneği tıklanır.
  3. Sağ üstteki arama kutusuna EntityFramework yazılır ve paketin listeye gelmesi beklenir.
  4. Paket seçilerek Install butonuna tıklandığında yükleme başlar.

Karşılaşılabilecek sorunlara dair ipuçları

 

İpucu 1

Önceki sürümde veritabanındaki store prosedürler gibi yapıları çağırmak işin kullanılan  SqlCommand komutu ExecuteSqlCommand olarak değiştirilmiş.

//return base.Database.SqlCommand(“DeleteAccounts”);
return base.Database.ExecuteSqlCommand(“DeleteAccounts”);

 

İpucu 2

ModelBuilder nesnesi DbModelBuilder olarak yeniden adlandırılmıştır.

//protected override void OnModelCreating(ModelBuilder modelBuilder)
protected override void OnModelCreating(DbModelBuilder modelBuilder)

 

İpucu 3

MapLeftKey ve MapRightKey extension metodlarının aşırı yüklenmiş metodlarıyla değiştirilmiştir. Aşağıdaki kodda verilen değişikliği inceleyebilirsiniz.

 

//modelBuilder.Entity<WatchList>().HasMany(w => w.Securities)
// .WithMany()
// .Map(map => map.ToTable("WatchListSecurity")
// .MapRightKey(s => s.Id, "SecurityId")
// .MapLeftKey(wl => wl.Id, "WatchListId"));
modelBuilder.Entity<WatchList>().HasMany(w => w.Securities)
       .WithMany()
       .Map(map => map.ToTable("WatchListSecurity")
       .MapRightKey("SecurityId")
       .MapLeftKey("WatchListId"));

Kaynak: http://blogs.msdn.com/b/adonet/archive/2011/07/25/ef-4-1-update-1-released.aspx

Windows Live Hotmail için Outlook 2007 Ayarları

21 Ağu

Microsoft’un Hotmail için POP3 desteği vermesinden sonra Office Outlook ortamından maillere erişip yönetmek mümkün hale geldi. Windows Live hesabı olan arkadaşlar hesaplarına Outlook ortamından erişebilmek için aşağıdaki yöntemi izleyebilirler. Bu ayarları test edip ayarların çalıştığını gördükten sonra paylaşıyorum. Bilgisayarımda yüklü office sürümünün dili ingilizce olduğu için resimlerde ingilizce ayarlar görünüyor olacaktır.

Ayarlar

  1. Outlook penceresinden Araçlar (Tools)Hesap Ayarları (Account Settings) seçilir.
  2. Yeni (New) butonuna tıklayarak Yeni E-posta Hesabı Ekle (Add New E-Mail Account) penceresi açılır. Açılan pencerede “Microsoft Exchange, POP3, IMAP ve HTTP” seçeneği işeretlenerek ilerlenir.
  3. Gelen pencerede alt köşede “Sunucu ayarlarını veya ek sunucu türlerini el ile yapılandır” (Manually configure server settings or additional server types)seçeneği işeretlenerek ilerlenir.
  4. Gelen pencerede “Internet E-Posta” (Internet E-Mail) seçeneğini seçip ilerlenir.
  5. Bu yeni pencerede gerekli bilgilerin girilmesi gerekiyor.

  • Adınız (Your Name): Adınız ve soyadınız ( Bu alan mail gönderdiğinizde gönderdiğiniz kişinin mail kutusunda kimden kısmında yazacak olan bilgidir.)
  • E-Posta Adresi (E-Mail Adress): sample@hotmail.com veya sample@windowslive.com (Windows Live Hotmail adresiniz)
  • Hesap Türü (Account Type): POP3 seçilir.
  • Gelen Posta Sunucusu (Incoming mail server): pop3.live.com
  • Giden Posta Sunucusu (Outgoing mail server SMTP): smtp.live.com
  • Kullanıcı Adı (User Name): genelde mail adresidir. sample@hotmail.com gibi
  • Parola (Password): Mail şifresiniz.
  • Parolamı Anımsa (Remember password): işaretlenir. İşaretlenmezse her Outlook açıldığında size parola soracaktır.
  • Güvenli Parola kimlik doğrulaması kullanarak durum açılsın (Require logon using Secure Password Authentication SPA) işaretlenir.

 

  1. Bilgiler eksiksiz girildikten sonra Diğer Ayarlar (More Options) butonu tıklanarak Internet E-Posta Ayarları (Internet E-Mail Settings) penceresi açılır.
  2. Genel (General) sekmesinde kişisel ayarlar vardır ve isteğe bağlı doldurulabilir.
  3. Giden sunucu (Outgoing server) sekmesinde Giden sunucum (SMTP) için kimlik doğrulaması gerekiyor (My outgoing server (SMTP) requires authentication) seçeneği işeretlenir.
  4. Bağlantı (Connection) sekmesinde bir değişiklik yapmaya gerek yok.
  5. Gelişmiş (Advenced) sekmesinde  Gelen sunucu (POP3) (Incoming Server POP3) port değeri 995 olarak girilir. Bu sunucu şifreli bir bağlantı gerektirir (This server requires an encrypted connection SSL) Kutucuğu işaretlenir. Giden sunucu SMTP (Outgoing server SMTP) port değeri olarak 587 girilir. Aşağıdaki şifreli bağlantı türünü kullan (Use The following type of encrypted connection) listesinden TLS seçilir. Ardından Tamam butonuna tıklanır.
  6. Artık bütün ayarlar yapılmış durumda ve Hesap ayarlarını sına (Test Account Settings) Butonuna tıklayarak testin başarılı bir şekilde gerçekleşmesi beklenir.

Sonraki pencerede Son (Finish) butonu tıklanarak mail adresindeki verilerin indirilmesi işlemi başlar.

Bir sonraki yazıda görüşmek üzere.

Asp.net MVC ActionName Attribute

21 Ağu

ActionName attribute bir action metodunun farklı isimlerle adlandırılmasını sağlar. Bu işlem iki farklı yolla yapılır.

Birinci yöntem olarak overload edilmiş, yani aynı isimdeki iki metodu birbirinden ayırmak için kullanabiliriz. Örneğin Product controller Details() adında iki metoda sahip olsun. İlk Details() metodu integer tipinde id parametresi alıyor olsun. İkinci Details() metodu parametre almasın. Bu durumda iki metodu birbirinden ayırmak için ActionName attribute kullanılabilir.

İkinci yöntem olarak ise farklı isimdeki metodları aynı isimle çağırmak isteyebiliriz. Yani ilk yöntemin tam tersi bir durum olabilir.


[ActionName(“Edit”)]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Edit_GET(Merchandise merchandiseToEdit)
{
     return View(merchandiseToEdit);
}

// POST: /Merchandise/Edit

[ActionName(“Edit”)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit_POST(Merchandise merchandiseToEdit)
{
     try {
           return RedirectToAction(“Edit”);
         }
     catch
         {
           return View();
         }
}

Dikkat: Bir sınıf içinde aynı isimde ve aynı parametreyi alan iki metod bulunamaz. Ancak aynı isimde ve aynı parametre alan iki action olabilir.

Örnekte gördüğümüz gibi iki Edit() metodundan biri HTTP GET operasyonu, diğeri ise HTTP POST operasyonu tarafından çağrılıyor.


		

ViewData kavramı ve ViewModel Deseni

19 Ağu

ViewData yardımıyla Controller tarafından View tarafına veri geçirme işlemi

Bu yazımızda mvc ortamında kullanılan ViewModel deseni üzerinde duracağız. View katmanına Controller sınıfından ViewData, TempData, ViewBag gibi nesneler yardımıyla veri geçirebilmekteyiz. Örneğin bir dropdodwnlist bileşeninin içeriğini taşıyan kolleksiyon nesnesi bu yapılar vasıtasıyla View sayfasına taşınabilmektedir. Örneklendirmeyi NerdDinner uygulaması üzerinden yapılmaktadır.

Controller Tarafı:

public ActionResult Edit(int id) {

Dinner dinner = dinnerRepository.GetDinner(id);

ViewData[“Countries”] = new SelectList(PhoneValidator.Countries,

dinner.Country);

return View(dinner);

}

View Tarafı:

Html.DropDownList(“Country”, ViewData[“Countries”] as SelectList)

Yukarıda görüldüğü gibi ViewData nesnesi Country listesini view tarafına taşımaktadır.

ViewModel Deseni

Yukarıda bahsettiğimiz şekilde conroller sınıfından view şablonuna veri geçirmek kısa vadede pratik ve hızlı bir çözümdür. Küçük projelerde kullanılabilecek iyi bir yöntem olarak görülebilir. Fakat bu yöntemin uzun vadede bazı dezavantajları vardır. Bunlardan biri geliştirici string tabanlı bir yazım yöntemi kullandığı için (ViewData[“Countries”]) herhangi bir yazım yanlışında derleme zanında hata yakalanamayacaktır. Bir diğer dezavantaj ise ViewData nesnesinin bir SelectList tipine çevrilrme gereği duyulmasıdır.

Bu dezavantajlara alternatif olarak sunulan bir çözüm ise VievModel deseninin kullanılmasıdır. Yani View şablonunda ihtiyaç duyulacak bileşenlere göre bir sınıf oluşturularak Strongly-typed yöntemi ile View sayfası bu sınıftan üretilir. View sayfasında kullanacağımız dropdown gibi bileşenler için SelectList nesneleri yazdığımız sınıf içine tanımlanır. Controller sınıfı yardımıyla optimize edilmiş ViewModel sınıfı Viewtarafına sunulmuş olur.

public class DinnerFormViewModel {

// Properties

public Dinner Dinner { get; private set; }

public SelectList Countries { get; private set; }

// Constructor

public DinnerFormViewModel(Dinner dinner) {

Dinner = dinner;

Countries = new SelectList(PhoneValidator.Countries,

dinner.Country);

}

}

Yukarıda Nerddinner projesinden bir ViewModel örneği gösterilmiştir. Yani view şablonunda Dinner nesnesi ve country listesini tutacak birde SelectList nesnesi oluşturulmuştur.

Güncelleme işlemi için action metodlarını aşağıdaki gibi tanımlayabiliriz.

[Authorize]

public ActionResult Edit(int id)
{

Dinner dinner = dinnerRepository.GetDinner(id);

return View(new DinnerFormViewModel(dinner));

}

[AcceptVerbs(HttpVerbs.Post)]

public ActionResult Edit(int id, FormCollection collection) {

Dinner dinner = dinnerRepository.GetDinner(id);
try {

UpdateModel(dinner, “Dinner”);

dinnerRepository.Save();

return RedirectToAction(“Details”, new { id=dinner.DinnerID });

}

catch {

ModelState.AddModelErrors(dinner.GetRuleViolations());

return View(new DinnerFormViewModel(dinner));

}

}

Dikkat 1

Bu noktada dikkat etmemiz gereken önemli bir nokta: View sayfasının DinnerFormViewModel sınıfından türemiştir.

Dikkat 2

Eğer view sayfası Dinner sınıfından türetilseydi UpdateModel() metodu şu şekilde olacaktı.

UpdateModel(dinner);

Ancak DinnerFormViewModel sınıfından türetildiği için şu şekilde olmuştur.

UpdateModel(dinner, “Dinner”);

Asp.net app_offline.htm dosyası Site Bakımda uyarısı

7 Ağu

Asp.net 2.0 ile birlikte gelen yeniliklerden bir taneside sunucuda çalışan uygulamalarımızı offline hale getirebileceğimiz özellik.

Web uygulamamızın kök dizinine app_offline.htm adında bir dosya bıraktığımızda Asp.net uygulamamızı kapatacaktır.

Artık uygulamamızın hiçbir sayfasına erişmek mümkün değildir. Sitemize gelen istekler direk app_offline.htm sayfasına yönlendirilecektir. app_offline.htm sayfasına sitenin kapalı olmasının sebebini bildirecek mesajlar verebiliriz. “Sitemiz geçici olarak bakıma alınmıştır.” gibi.

Bu yöntem uygulammızda köklü değişiklikler yaparken veya uygulamamızın çalışmasını etkileyecek küçük değişiklikler yaparken faydalı olacaktır.

Yapılan değişiklikler bittikten sonra app_offline.htm dosyasını kaldırdığımızda Asp.net uygulamamızı tekrar başlatacak ve uygulamamız yeni haliyle kaldığı yerden yoluna devam edecektir.