ใช้ WebAPI หรือ MVC เพื่อส่งคืน JSON ใน ASP.NET


138

ฉันกำลังสร้างแอพพลิเคชั่น ASP.NET MVC ที่ใช้งานสคริปต์ไคลเอนต์มากมันจะใช้ JSON และ jQuery เพื่อจัดการ DOM

ความเข้าใจของฉันคือทั้งWeb API ControllerและMVC Controllerสามารถส่งคืน JSON

เมื่อพิจารณาสถานการณ์ของฉันฉันควรใช้Web API ControllerหรือMVC Controllerหรือไม่



1
สิ่งสำคัญที่ควรทราบคือคำถามนี้มีความเฉพาะเจาะจงกับบริบทบางอย่าง: ผู้เขียนต้องการทราบว่าคอนโทรลเลอร์ใดที่จะใช้หากควรส่งคืน json เท่านั้น REST API ช่วยให้การจัดรูปแบบสื่อที่แตกต่างกันขึ้นอยู่กับการเจรจาต่อรองเนื้อหา (เช่น: ยอมรับ xml, ยอมรับ json) ในกรณีนี้ตัวควบคุม WebAPI เป็นตัวเลือกที่ดีที่สุดของคุณ
Sentinel

คำตอบ:


156

ตัวควบคุมเว็บ API สามารถสร้างและโฮสต์ในแอปพลิเคชัน ASP.NET ใด ๆ ไม่ได้เป็นเพียงแอปพลิเคชัน MVC ดังนั้นเหตุผลที่ชัดเจนในการสร้าง Web API คือหากคุณไม่มีส่วนหน้าของ MVC (เช่นบริการเว็บแบบดั้งเดิมที่สงบเงียบซึ่งโฮสต์โดย บริษัท / องค์กรของคุณ)

โดยทั่วไปแล้วตัวควบคุม MVC จะใช้ MVC Framework หากคุณดูเทมเพลตเริ่มต้นและงานส่วนใหญ่ที่ทำโดยชุมชนและเพื่อนของคุณคุณจะสังเกตเห็นว่าตัวควบคุม MVC เกือบทั้งหมดจะถูกนำไปใช้กับมุมมอง

โดยส่วนตัวแล้วฉันใช้ MVC Controllers เมื่อฉันต้องการตอบโต้ด้วย View () และฉันจะใช้ Web API สำหรับสิ่งที่ไม่ได้ขึ้นอยู่กับมุมมองที่เฉพาะเจาะจง

แน่นอนว่ามีข้อแม้ แต่โดยทั่วไปแล้วหากคุณไม่ต้องการใช้ Model Binding พฤติกรรมของ MVC บริการของคุณคือ data-centric และการดำเนินการคือ data-centric (เช่นการทำงาน CRUD) คุณอาจต้องการ 'Web API Controller 'แทนที่จะเป็น' Model-View Controller ' ในทางกลับกันหากการดำเนินการของคุณเป็นแบบ View-Centric (เช่นการส่งหน้าผู้ดูแลระบบของผู้ใช้ไปยังผู้ใช้) หรือคุณต้องการ Model Binding ของ MVC เพื่อสร้าง 'ajax partials' (ไม่น่าเป็นไปได้มาก) คุณจะต้องการ MVC Controller แทน

โดยส่วนตัวแล้วฉันใช้ตัวควบคุม Web API สำหรับการขับลูกค้า RESTful ที่ใช้ JSON ฉันใช้ตัวควบคุม MVC เพื่อจัดการเส้นทางเบราว์เซอร์พื้นฐานและส่งมอบสปา


32

WebAPI สำหรับสร้าง API หากคุณต้องการให้ใครบางคนใช้ API ของคุณใน XML, JSON ฯลฯ คุณสามารถสร้างเว็บ API ได้

ในกรณีของคุณคุณจะต้องคุยกับลูกค้าใน JSON เท่านั้น

แม้ว่าเว็บไซต์ของคุณส่วนใหญ่จะเป็นสคริปต์ไคลเอนต์ แต่คุณยังคงใช้ ASP.NET MVC Controller อยู่ใช่ไหม? และเนื่องจากคุณอาจแบ่งตัวควบคุมของคุณตามหลักหน่วยงานอย่างสมเหตุสมผลแล้วจึงควรเพิ่มวิธีการให้บริการ json เหล่านั้นในทางตรงข้ามกับการสร้างคลาสอื่นสำหรับเว็บ API โดยเฉพาะ

ดังนั้นสำหรับสถานการณ์เฉพาะของคุณ (ถ้าฉันเข้าใจถูกต้อง) ฉันจะยึดกับผู้ควบคุม


ขอบคุณมีความแตกต่างในวิธีการที่เราสร้าง WebAPI vs Controller หรือไม่?
ไม่มี Pun

1
@flybyte ใช่คุณต้องได้รับจาก ApiController ดูasp.net/web-api/overview/getting-started-with-aspnet-web-api/…
Muhammad Hasan Khan

4
Web Api สามารถทำ JSON ได้เช่นเดียวกับวิธีอื่น ๆ ที่คุณระบุไว้ ผู้ควบคุมไม่สามารถ (กลายเป็น API) ได้อย่างเรียบร้อยดังนั้นผู้ใช้จึงมีความคาดหวังที่จะถาม - ฉันขอแนะนำให้ใช้โซลูชันที่ปรับขนาดได้ / ยืดหยุ่นมากขึ้น มันไม่เหมือนกับบริการ WCF ของโรงเรียนเก่า web api โดยทั่วไปจะมีประสิทธิภาพและยืดหยุ่น ดังนั้นในขณะที่คุณต้องการสถานการณ์ง่าย ๆ เพียงอย่างเดียว แต่ถ้าคุณมีพลังคุณก็ต้องการมัน
สตีฟ

8

คำตอบนี้จะแยกออกจากความกังวลเร่งการสร้างบริการและพึ่งพาการประชุมมากกว่าการกำหนดค่า

ความรับผิดชอบหลักของคอนโทรลเลอร์คือการทำงานเป็นผู้ประสานงานระหว่างมุมมองและโมเดลของคุณ แต่ในฐานะที่เป็นความรับผิดชอบหลักของ API คือการทำงานกับข้อมูล ในกรณีของอนุสัญญาของ API ทำให้ง่ายต่อการดำเนินการ CRUD ด้านล่างคือการจับคู่ระหว่างการดำเนินการ CRUD และการกระทำ HTTP

  • GET: อ่าน
  • POST: สร้าง
  • PUT: อัปเดต
  • ลบ: ลบ

ดังนั้นด้วย API คุณไม่จำเป็นต้องสร้างแอคชันแยกต่างหากและกำหนดแอททริบิวเหล่านั้นด้วยแอคชั่น HTTP


0

ข้อกังวลเดียวที่ฉันมีกับ ApiController ก็คือมันไม่ได้อิงตามพื้นที่ หนึ่งไซต์สามารถมีโฟลเดอร์ย่อย apicontroller ได้เพียงโฟลเดอร์เดียวเพื่อให้คุณตั้งชื่อวิธีการควบคุมของคุณ มีสถานการณ์ที่คุณอาจต้องการทำซ้ำชื่อคอนโทรลเลอร์ในพื้นที่ต่าง ๆ :

domain.com/api/area1/controller1/

domain.com/api/area2/controller1/

ฉันจำได้ว่ามีการตั้งค่ารหัสที่กำหนดเองเพื่อให้สามารถทำสิ่งนี้ได้ แต่จะไม่ทำงานตามค่าเริ่มต้น


ดูเหมือนว่าความคิดเห็นไม่ใช่คำตอบ
Dylan Hayes

ไม่จริง ๆ สิ่งที่คุณพูด หากคุณตั้งชื่อคอนโทรลเลอร์ Area1XController คุณสามารถทำได้: domain.com/Area1X/1 สร้างคอนโทรลเลอร์: Area2XController แล้วเข้าถึงได้ด้วย: domain.com/Area2X/1 คำถามใหญ่คือเหตุผลที่คุณต้องการทำเช่นนั้น ชื่อพื้นที่เป็นนามธรรมมันบอกอะไรกับผู้ใช้ หากคุณได้บอกว่า 4 พื้นที่คุณควรใช้ชื่อวัตถุประสงค์ในการทำงานดีกว่า
เฮอร์แมนแวนเดอร์บลอม

0

ฉันเห็นด้วยกับคำตอบที่ Shaun Wilson (คำตอบยอดนิยม) แต่ไม่แน่ใจว่าทำไมเพราะฉันเป็นเพียงเล็กน้อยสับสนและยังคงพยายามที่จะเข้าใจกับลางสังหรณ์ต่อไปนี้ (อาจไม่ถูกต้อง) -

  • ใช้ WebAPI Controller เพื่อส่งข้อมูล JSON ไปยังไคลเอนต์เพื่อให้ลูกค้าสามารถจัดการกับการจัดการมุมมอง กระบวนการนี้ไม่จำเป็นต้องมีมุมมอง แต่เป็นเพียงการตอบสนองกลับไปยังสิ่งที่เรียกว่าวิธีการ (เช่นคำขอจาวาสคริปต์) เพื่อให้ลูกค้าสามารถจัดการกับการจัดการด้านลูกค้าใด ๆ
  • ใช้คอนโทรลเลอร์ MVC เมื่อคุณต้องการใช้ข้อมูลเพื่อจัดการมุมมองระหว่างหรือหลัง page_load (เช่นไม่ใช่สำหรับแอป SPA)

คุณจะเห็นว่าฉันไม่รู้ว่าฉันไม่ถูกต้องที่นี่และสับสนเพราะคำตอบสุดท้ายของ Shaun ระบุไว้ว่า "ฉันใช้ตัวควบคุม MVC เพื่อจัดการการกำหนดเส้นทางเบราว์เซอร์ขั้นพื้นฐานและการส่งมอบสปา" - บางทีฉันไม่ทราบว่าลูกค้าที่สงบคืออะไรเมื่อฉันคิดว่ามันอาจเป็นวิธี JavaScript ที่ได้รับการตอบสนองในรูปแบบ JSON นี่เป็นโพสต์ที่ใกล้เคียงที่สุดใน Stackoverflow ที่เกี่ยวข้องกับคำตอบของคำถามจากระยะไกลดังนั้นฉันจึงตอบคำถามนี้แทนที่จะเป็นคำถามที่ซ้ำ


" ใช้ตัวควบคุม MVC เพื่อส่งมอบมุมมอง " คุณสามารถห่อ SPA ไว้ในส่วน MVC เพื่อจัดองค์ประกอบเป็นมุมมอง ASP.NET MVC devs ควรเข้าใจแนวคิดนี้ คุณสามารถใช้สิ่งอำนวยความสะดวก Razor + ASP.NET ปกติในระหว่างการสร้างมุมมอง (เช่นการประมวลผลฝั่งเซิร์ฟเวอร์) เพื่อแสดง HTML + JS ไปยังไคลเอนต์ ปัญหาที่ผู้พัฒนาซอฟต์แวร์ส่วนใหญ่จะพบคือความคิดที่ว่าไฟล์ HTML + JS แบบคงที่ไม่ใช่สิ่งที่ทำให้ SPAเป็น SPA บางครั้งเนื้อหาต้องเป็นแบบไดนามิกและเฉพาะเจาะจงกับผู้ใช้ แต่กรอบงานทั้งหมดมีแนวโน้มที่จะเบี่ยงเบนจากข้อเท็จจริงนี้ "SPA" และ "MVC" ไม่ได้เกิดขึ้นพร้อมกัน
ฌอนวิลสัน

0

ในสถานการณ์สมมตินี้ฉันจะแนะนำ WebApi เนื่องจากเหมาะสำหรับการถ่ายโอนข้อมูลเช่นนี้ตามคำขอ Javascript ฉันมักจะพัฒนาตัวควบคุม WebApi ของฉันเพื่อให้พวกเขาส่งคืนวัตถุที่เป็นมิตรกับ JSON ที่สามารถแยกวิเคราะห์ได้ง่ายโดย Javascript ของฉัน

เรียลไทม์เท่านั้นที่คุณต้องการใช้การกระทำกับคอนโทรลเลอร์ MVC สำหรับสิ่งนี้หากคุณต้องการสร้าง HTML บางส่วนและแทนที่ส่วนของหน้าเว็บของคุณด้วยการเรียก Javascript

ตัวอย่างเช่น:

คุณมี DatePicker UI ของ JQuery ซึ่งเมื่อทำการเลือกจะสร้างรายการของปุ่มตัวเลือกที่แสดงเหตุการณ์ในวันที่เลือก

ในสถานการณ์นี้คุณสามารถใช้ WebApi เพื่อส่งคืน JSON บางส่วนจากนั้นสร้าง HTML ที่จำเป็นโดยใช้ Javascript แต่โดยทั่วไปแล้วมันเป็นวิธีปฏิบัติที่ไม่ถูกต้องในการสร้าง HTML จำนวนมากโดยใช้ Javascript มันจะเป็นการดีกว่าถ้าให้ C # สร้าง HTML ขึ้นมาแล้วส่งคืนผ่านมุมมองบางส่วนเนื่องจากวิธีนี้คุณมีโอกาสน้อยที่จะพบข้อผิดพลาดกับการแยกวิเคราะห์ Javascript ไม่ต้องพูดถึงมันทำให้การเขียน HTML ง่ายขึ้นมาก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.