ASP.NET Core MVC'de denetleyiciler aracılığıyla istekleri işleme

Tarafından Steve Smith ve Scott Addie

Denetleyiciler, eylemler ve eylem sonuçları, geliştiricilerin ASP.NET Core MVC kullanarak uygulama derlemesinin temel bir parçasıdır.

Denetleyici nedir?

Denetleyici, bir eylem kümesini tanımlamak ve gruplandırmak için kullanılır. Eylem (veya eylem yöntemi), bir denetleyicide istekleri işleyen bir yöntemdir. Denetleyiciler, benzer eylemleri mantıksal olarak birlikte gruplandırıyor. Eylemlerin bu toplaması yönlendirme, önbelleğe alma ve yetkilendirme gibi ortak kural kümelerinin toplu olarak uygulanmasını sağlar. İstekler yönlendirme yoluyla eylemlere eşlenir. Denetleyiciler her istekte etkinleştirilir ve devredışı bırakılır.

Kurala göre, denetleyici sınıfları:

  • Projenin kök düzeyindeki Denetleyiciler klasöründe bulun.
  • Microsoft.AspNetCore.Mvc.Controller'den devral.

Denetleyici, aşağıdaki koşullardan en az birinin doğru olduğu, genellikle genel olarak örneklenebilir bir sınıftır:

  • Sınıf adının sonuna Controller eki getirilmiştir.
  • Sınıf, adı Controller ile biten bir sınıftan devralır.
  • [Controller] özniteliği sınıfına uygulanır.

Denetleyici sınıfının ilişkili [NonController] özniteliği olmamalıdır.

Denetleyiciler Açık Bağımlılıklar İlkesi'ni izlemelidir. Bu ilkeyi uygulamaya yönelik birkaç yaklaşım vardır. Birden çok denetleyici eylemi aynı hizmeti gerektiriyorsa, bu bağımlılıkları istemek için oluşturucu enjeksiyonu kullanmayı göz önünde bulundurun. Hizmet yalnızca bir eylem yöntemince ihtiyaç duyuluyorsa, bağımlılığı talep etmek için Action Injection kullanmayı göz önünde bulundurun.

Model-View-Controller deseninde, bir denetleyici, isteğin ilk işlenmesinden ve modelin örneklenmesinden sorumludur. Genel olarak, iş kararları model içinde yapılmalıdır.

Denetleyici, modelin işlemesinin (varsa) sonucunu alır ve uygun görünümü ve ilişkili görünüm verilerini veya API çağrısının sonucunu döndürür. daha fazla bilgi için bkz . ASP.NET Core MVC'ye Genel Bakış ve ASP.NET Core MVC ve Visual Studio'yu kullanmaya başlama.

Denetleyici, kullanıcı arabirimi düzeyinde bir soyutlamadır. Sorumlulukları, istek verilerinin geçerli olduğundan emin olmak ve api için hangi görünümün (veya sonucun) döndürüleceğini seçmektir. İyi faktörlü uygulamalarda veri erişimini veya iş mantığını doğrudan içermez. Bunun yerine denetleyici, bu sorumlulukları üstlenen hizmetlere devreder.

Eylemleri Tanımlama

Bir denetleyicideki ortak yöntemler, özniteliğine [NonAction] sahip olanlar dışında eylemlerdir. Eylemlerdeki parametreler istek verilerine bağlıdır ve model bağlama kullanılarak doğrulanır. Model doğrulaması, modele bağlı olan her şey için gerçekleşir. ModelState.IsValid Özellik değeri, model bağlama ve doğrulamanın başarılı olup olmadığını gösterir.

Eylem yöntemleri, bir isteği bir iş sorununa eşlemek için mantık içermelidir. İş kaygıları genellikle denetleyicinin bağımlılık ekleme yoluyla eriştiği hizmetler olarak temsil edilmelidir. Eylemler daha sonra iş eyleminin sonucunu bir uygulama durumuyla eşler.

Eylemler her şeyi döndürebilir, ancak genellikle yanıt üreten bir IActionResult örneğini (veya asenkron yöntemler için Task<IActionResult>) döndürür. Eylem yöntemi, ne tür bir yanıt seçmekten sorumludur. Eylem sonucu yanıt verir.

Denetleyici Yardımcısı Yöntemleri

Denetleyiciler genellikle öğesinden Controller devralır, ancak bu gerekli değildir. 'den Controller türetme, üç yardımcı yöntem kategorisine erişim sağlar:

1. Boş yanıt gövdesine neden olan yöntemler

Content-Type Yanıt gövdesinde anlatacak içerik olmadığından HTTP yanıt üst bilgisi eklenmez.

Bu kategoride iki sonuç türü vardır: Yeniden yönlendirme ve HTTP Durum Kodu.

  • HTTP Durum Kodu

    Bu tür bir HTTP durum kodu döndürür. Bu tür yardımcı yöntemlerden birkaçı , BadRequestve NotFoundşeklindedirOk. Örneğin, return BadRequest(); yürütülürken 400 durum kodu üretir. BadRequest, NotFound ve Ok gibi yöntemler aşırı yüklendiğinde, içerik müzakeresi gerçekleştiğinden, artık HTTP Durum Kodu yanıtlayıcıları olarak nitelenmez.

  • Yönlendirme

    Bu tür, Redirect, LocalRedirect, RedirectToAction veya RedirectToRoute kullanarak bir eyleme veya hedefe yönlendirme döndürür. Örneğin, anonim bir nesne geçirerek return RedirectToAction("Complete", new {id = 123});, Complete'e yönlendirir.

    Yeniden yönlendirme sonuç türü, öncelikle bir Location HTTP yanıt üst bilgisinin eklenmesiyle HTTP Durum Kodu türünden farklıdır.

2. Önceden tanımlanmış içerik türüne sahip boş olmayan bir yanıt gövdesine neden olan yöntemler

Bu kategorideki yardımcı yöntemlerin çoğu, yanıt gövdesini açıklamak için yanıt üst bilgisini ayarlamanıza ContentType olanak sağlayan bir Content-Type özellik içerir.

Bu kategoride iki sonuç türü vardır: Görünüm ve Biçimlendirilmiş Yanıt.

  • Görünüm

    Bu tür, HTML işlemek için bir model kullanan bir görünüm döndürür. Örneğin, return View(customer); bir modeli veri bağlama için görünüme geçirir.

  • Biçimlendirilmiş Yanıt

    Bu tür, bir nesneyi belirli bir şekilde temsil etmek için JSON veya benzer bir veri değişimi biçimi döndürür. Örneğin, return Json(customer); sağlanan nesneyi JSON biçiminde serileştirir.

    Bu türün diğer yaygın yöntemleri arasında File ve PhysicalFilebulunur. Örneğin, return PhysicalFile(customerFilePath, "text/xml"); döndürür PhysicalFileResult.

3. İstemciyle üzerinde anlaşmaya varılan bir içerik türünde biçimlendirilmiş boş olmayan yanıt gövdesiyle sonuçlanan yöntemler

Bu kategori İçerik Anlaşması olarak daha iyi bilinir. İçerik uzlaşması, bir eylem bir tür veya IActionResult uygulamasından farklı bir şey döndürdüğünde uygulanır. "IActionResult uygulaması olmayan bir eylem (örneğin, object) aynı zamanda Biçimlendirilmiş Yanıt döndürür."

Bu tür bazı yardımcı yöntemler arasında BadRequest, CreatedAtRouteve Okbulunur. Bu yöntemlere return BadRequest(modelState);örnek olarak sırasıyla , return CreatedAtRoute("routename", values, newobject);ve return Ok(value);verilebilir. Dikkat edin, BadRequest ve Ok yalnızca bir değer geçirildiğinde içerik anlaşması gerçekleştirir; bir değer geçirilmediğinde, HTTP Durum Kodu sonuç türleri olarak hizmet eder. Öte yandan, CreatedAtRoute yöntemi her zaman içerik müzakeresi gerçekleştirir çünkü aşırı yüklemelerinin tümü bir değerin geçmesini gerektirir.

Çapraz İşlevli Konular

Uygulamalar genellikle iş akışlarının bölümlerini paylaşır. Örnek olarak alışveriş sepetine erişmek için kimlik doğrulaması gerektiren bir uygulama veya bazı sayfalarda verileri önbelleğe alan bir uygulama verilebilir. Eylem yöntemi öncesinde veya sonrasında mantık gerçekleştirmek için filtre kullanın. Çapraz kesen endişelerde Filtreler kullanmak yinelemeyi azaltabilir.

gibi [Authorize]çoğu filtre özniteliği, istenen ayrıntı düzeyine bağlı olarak denetleyici veya eylem düzeyinde uygulanabilir.

Hata işleme ve yanıt önbelleğe alma genellikle katmanlar arası kaygılar arasındadır.

Birçok çapraz kesme sorunu filtreler veya özel ara yazılım kullanılarak işlenebilir.