ASP.NET'te JSON döndürmek için WebAPI veya MVC kullanma


138

Ben istemci komut dosyası ağır bir ASP.NET MVC uygulaması inşa ediyorum, DOM manipüle JSON ve jQuery kullanır.

Benim anlayış hem Web API Denetleyici ve MVC denetleyicisi JSON dönebilirsiniz.

Senaryom göz önüne alındığında, bir Web API Denetleyicisi veya bir MVC Denetleyicisi kullanmalı mıyım?



1
Dikkat edilmesi gereken önemli bir nokta da bu sorunun belirli bir bağlama özgü olmasıdır: yazar SADECE json döndürülecekse hangi denetleyicinin kullanılacağını bilmek ister. Bir REST API, içerik anlaşmasına bağlı olarak farklı medya biçimlendirmelerine izin verir (örneğin: xml kabul et, json kabul et). Bu durumda WebAPI denetleyicisi en iyi seçeneğinizdir
Sentinel

Yanıtlar:


156

Web API Denetleyicileri, yalnızca MVC uygulamalarında değil, herhangi bir ASP.NET Uygulamasında oluşturulabilir ve barındırılabilir. Bu nedenle, bir Web API oluşturmanın açık bir nedeni, bir MVC ön ucunuz yoksa (örneğin şirketiniz / kuruluşunuz tarafından barındırılan klasik, RESTful web hizmetleri).

MVC Denetleyicileri genellikle MVC Framework'e güvenir, varsayılan şablonlara ve topluluk ve akranlarınız tarafından yapılan çalışmaların çoğuna bakarsanız, neredeyse tüm MVC Denetleyicilerinin Görünüm göz önünde bulundurularak uygulandığını fark edeceksiniz.

Şahsen, bir View () ile yanıt vermek istediğimde MVC Denetleyicileri kullanıyorum ve belirli bir görünüme bağımlı olmayan herhangi bir şey için bir Web API kullanacağım.

Elbette uyarılar var, ancak genel olarak, MVC'nin Model Bağlama davranışına ihtiyacınız yoksa, hizmetiniz veri merkezli ve işlemler Veri merkezli (örneğin CRUD işlemleri) ise, muhtemelen bir 'Web API Denetleyicisi 'Model-Görünüm Kontrolörü' yerine. Tersine, işlemleriniz Görüntüleme merkezli ise (örneğin, kullanıcıya bir kullanıcı yönetici sayfası iletme) veya 'ajax kısmi' (çok düşük bir olasılıkla) oluşturmak için MVC'nin Model Bağlaması'na ihtiyacınız varsa, bunun yerine bir MVC Denetleyicisi istersiniz.

Şahsen, JSON tabanlı RESTful istemcilerini sürmek için Web API denetleyicilerini kullanıyorum, SPA'nın temel tarayıcı yönlendirmesini ve dağıtımını işlemek için MVC denetleyicilerini kullanıyorum.


32

WebAPI bir API oluşturmak içindir. Birisinin API'nizi XML, JSON, vb. İle tüketmesini istiyorsanız.

Sizin durumunuzda sadece JSON'daki istemciyle konuşmanız gerekir.

Web siteniz çoğunlukla istemci komut dosyası tahrikli olsa bile, hala ASP.NET MVC Denetleyicisi kullanıyor olacak değil mi? Ve zaten mantıksal olarak denetleyicilerinizi varlıklara göre böldüğünüz için, özellikle web api için başka bir sınıf yapmak yerine, bu json hizmet yöntemlerini eklemek mantıklıdır.

Bu nedenle, özel durumunuz için (doğru anlarsam), Kontrolörlere sadık kalırdım.


Teşekkürler, WebAPI ve Controller'ı nasıl yarattığımız konusunda bir fark var mı?
Nil Pun

1
@flybyte evet ApiController'den türetmeniz gerekiyor, bkz. asp.net/web-api/overview/getting-started-with-aspnet-web-api/…
Muhammed Hasan Han

4
Web Api, listelediğiniz diğer yöntemlerin yanı sıra JSON da yapabilir. Kontrolörler (düzgün bir şekilde) bir API'ye dönüştürülemez, bu yüzden kullanıcı sormak için öngörüleri göz önüne alındığında - daha ölçeklenebilir / esnek çözümü kullanmanızı öneririm. Eski okul WCF hizmetleri gibi değil, web api genellikle hem güçlü hem de esnektir. Bu yüzden sadece basit senaryolara ihtiyacınız olsa da, yolunuzdan uzak duruyor. BU, ihtiyacınız olduğunda güce sahipsiniz
steve

8

Yanıt, endişelerin ayrılması, hizmetlerin oluşturulmasının hızlandırılması ve konfigürasyondan ziyade sözleşmeye dayanılması ile ilgilidir.

Kontrolörlerin ana sorumluluğu, görünüm ve modeliniz arasında bir koordinatör olarak çalışmaktır, ancak API'nın ana sorumluluğu veriler üzerinde çalışmaktır. API'nın sözleşmeleri durumunda, CRUD işlemlerini gerçekleştirmeyi gerçekten kolaylaştırır. Aşağıda, CRUD işlemi ile HTTP eylemleri arasındaki eşleme bulunmaktadır

  • Oku
  • POST: Oluştur
  • PUT: Güncelleme
  • SİL: Sil

Dolayısıyla, API'larda ayrı eylemler oluşturmanız ve bunları HTTP eylemleriyle ilişkilendirmeniz gerekmez.


0

ApiController ile ilgili tek endişe alan tabanlı değil tabanlı. Bir sitede, denetleyici yöntemlerinizi adlandırmanız için yalnızca bir apicontroller alt klasörü olabilir. Farklı alanlarda denetleyici adını çoğaltmak isteyebileceğiniz durumlar vardır:

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

Bunu yapabilmek için bazı özel kod ayarları olduğunu hatırlıyorum ama varsayılan olarak çalışmıyor.


bu bir yorum gibi görünüyor, cevap değil.
Dylan Hayes

Söylediklerini gerçekten yapma. Bir denetleyici Area1XController adını verirseniz, şunları yapabilirsiniz: domain.com/Area1X/1, bir denetleyici: Area2XController oluşturun ve daha sonra şu etki alanına erişin: domain.com/Area2X/1. Büyük soru, bunu neden yine de yapmak istediğinizdir. Alan adı soyuttur, kullanıcıya hiçbir şey söylemez. Eğer 4 Alan diyelim, o zaman bunun için fonksiyonel amaç adını kullanmak daha iyidir.
Herman Van Der Blom

0

Shaun Wilson'ın (üst cevap) cevabına katılıyorum ama neden biraz kafam karıştığından ve hala aşağıdaki (muhtemelen yanlış) premonition ile anlamaya çalıştığımdan emin değilim -

  • İstemcinin görünüm manipülasyonunu işleyebilmesi için istemciye JSON verilerini teslim etmek için WebAPI Denetleyicisini kullanın. Bu işlem bir görünüm GEREKMEZ, sadece yöntem denilen her şeye (yani bir javascript isteği) bir yanıt gerektirir, böylece istemci herhangi bir istemci tarafı manipülasyonunu işleyebilir.
  • Sayfa_yükleme sırasında veya hemen sonrasında bir görünümü değiştirmek için verileri kullanmanız gerektiğinde MVC denetleyicisini kullanın (örn. SPA uygulamaları için değil).

Görüyorsunuz, burada nasıl yanlış olduğumu bilmiyorum ve kafam karıştı çünkü Shaun'un cevap satırının son satırı "SPA'nın temel tarayıcı yönlendirmesini ve dağıtımını işlemek için MVC denetleyicilerini kullanıyorum." - Belki de JSON formunda bir yanıt alan JavaScript yöntemi olabileceğini düşündüğümde tam olarak dinlendirici bir müşteri olduğunu bilmiyorum. Bu benim soruya bir cevap olarak uzaktan ilişkili olan Stackoverflow en yakın yazı, bu yüzden muhtemelen soru çoğaltma yerine bu yazı cevap ediyorum.


" Görünümü iletmek için MVC denetleyicisini kullanın " SPA'yı bir Görünüm içine kompozisyon için MVC kısmi olarak sarabilirsiniz. ASP.NET MVC geliştiricileri bu kavramı anlamalıdır. HTML + JS'yi istemciye dönüştürmek için görünüm oluşturma sırasında (ör. Sunucu tarafı işleme) normal Razor + ASP.NET olanaklarından yararlanabilirsiniz. birçok geliştiricinin burada yaşayacağı problem, statik HTML + JS dosyalarının SPA'yı SPA yapan şey olmadığı fikri . bazen içeriğin dinamik ve kullanıcıya özgü olması gerekir, ancak tüm çerçeveler bu gerçeği etkisiz hale getirir. "SPA" ve "MVC" birbirini dışlamaz.
Shaun Wilson

0

Bu senaryoda, Javascript isteklerine dayanarak bu gibi verileri aktarmak için mükemmel olduğu için WebApi'yi tavsiye ederim. Genellikle WebApi denetleyicileri geliştireceğim, böylece daha sonra Javascript tarafından kolayca ayrıştırılabilen bir JSON dostu nesne döndürürler.

Bu tür bir şey için bir MVC denetleyicisinde bir eylem kullanmak istediğiniz tek gerçek zaman, bazı HTML oluşturmak ve sayfanızın segmentlerini Javascript çağrılarıyla değiştirmek isteseniz olurdu.

Örneğin:

Bir JQuery UI Datepicker'ınız var, seçim üzerine seçilen günde olayları temsil eden radyo düğmelerinin bir listesini oluşturur.

Bu senaryoda, bazı JSON döndürmek ve sonra Javascript kullanarak gerekli HTML oluşturmak için WebApi kullanabilirsiniz, ancak Javascript kullanarak çok fazla HTML oluşturmak genellikle kötü bir uygulamadır. C # HTML oluşturmak ve daha sonra kısmi bir görünüm yoluyla döndürmek çok daha iyi olurdu, bu şekilde Javascript ayrıştırma hatalarıyla karşılaşma olasılığı daha azdır. Bahsetmemek gerekirse HTML'yi yazmayı çok daha kolay hale getiriyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.