ปัจจุบันมีข้อแตกต่างที่สำคัญอื่น ๆ ระหว่าง WebApi และ WCF Data Services ซึ่งไม่มีใครเคยพูดถึง ฉันหวังว่า MS จะออกมาพร้อมกับบทความที่ดีเปรียบเทียบทั้งสอง
ฉันติดตาม OData มาระยะหนึ่งแล้วและ WebApi ด้วย ฉันมักจะพบความแตกต่างที่สำคัญบางประการ
ก่อนอื่นฉันไม่แน่ใจว่าเจ้านายของคุณหมายถึงอะไรโดย "MS กำลังสนับสนุน WebApi" เนื่องจากหมายความว่าพวกเขาไม่ได้สนับสนุน OData ?? IMO พวกเขากำลังสนับสนุนทั้งสองอย่างและปัจจุบันมีการทับซ้อนกันเล็กน้อย Windows Azure Data Market เปิดเผยข้อมูลโดยใช้ OData, Azure Table Storage ใช้ OData, SharePoint 2010 อนุญาตให้ OData Queries ผ่าน Data และผลิตภัณฑ์อื่น ๆ จาก MS ก็รองรับเช่น Excel PowerPivot เป็นกรอบการสืบค้นข้อมูลที่มีประสิทธิภาพมากเมื่อพูดถึงข้อมูลเชิงสัมพันธ์ และเนื่องจากเป็นภาษา RESTful ภาษาเฟรมเวิร์กอุปกรณ์และอื่น ๆ สามารถรวมเข้ากับมันได้
นี่คือสิ่งที่ฉันชอบเกี่ยวกับ OData + WCF Data Services:
OData + WCF Data Services ได้อนุญาตให้แอปพลิเคชันไคลเอนต์สามารถ "แสดงออก" ได้มากขึ้นเมื่อทำการสืบค้นข้อมูลผ่านเว็บ ก่อนหน้านี้เราต้องใช้ ASMX หรือ WCF เสมอเพื่อสร้าง Web API ที่เข้มงวดซึ่งรับไม่ได้และต้องการการเปลี่ยนแปลงตลอดเวลาเมื่อใดก็ตามที่ UI ต้องการบางสิ่งที่แตกต่างออกไปเล็กน้อย แอปพลิเคชันไคลเอนต์สามารถระบุพารามิเตอร์เพื่อกำหนดเงื่อนไขที่จะส่งคืนเท่านั้น หรือทำเหมือนที่ฉันทำและ "Serialize" LINQ Expressions และส่งผ่านสิ่งเหล่านั้นเป็นพารามิเตอร์และไฮเดรตอีกครั้งExpressions<Func<T,bool>>
ในเซิร์ฟเวอร์ ดี ทำงานเสร็จแล้ว แต่ฉันต้องการใช้ LINQ บนไคลเอนต์และแปลผ่านเว็บโดยใช้ REST ซึ่งเป็นสิ่งที่ OData อนุญาตและฉันไม่ต้องการใช้ "แฮ็ก" ของโซลูชันของตัวเอง
มันเหมือนกับการเปิดเผย "TRANSACT SQL" โดยไม่ต้องใช้ DB Connection String เพียงแค่ระบุ URL และ whoala! เริ่มการสืบค้น แน่นอนว่าทั้ง WebApi และ WCF Data Services รองรับการพิสูจน์ตัวตน / การอนุญาตดังนั้นคุณจึงสามารถควบคุมการเข้าถึงผนวกคำสั่ง "Where" เพิ่มเติมตามบทบาทหรือการกำหนดค่าข้อมูลอื่น ๆ ฉันอยากทำใน Web Api Layer มากกว่าใน SQL (เช่นการสร้าง Views หรือ Stored Procs) และตอนนี้แอปพลิเคชันสามารถสร้างแบบสอบถามได้เองคุณจะเห็นเครื่องมือ Ad-Hoc และ BI Reporting เริ่มใช้ประโยชน์จาก OData และอนุญาตให้ผู้ใช้กำหนดผลลัพธ์ของตนเองได้ ไม่อาศัยรายงานแบบคงที่ซึ่งมีการควบคุมเพียงเล็กน้อย
เมื่อพัฒนาใน Silverlight, Windows 8 Metro หรือ ASP.NET (MVC, WebForms และอื่น ๆ ) คุณสามารถเพิ่ม "การอ้างอิงบริการ" ใน Visual Studio ไปยัง WCF Data Service และเริ่มใช้ LINQ เพื่อสืบค้นข้อมูลได้อย่างรวดเร็วและคุณจะได้รับ "บริบทข้อมูล" บนไคลเอนต์ซึ่งหมายความว่าจะติดตามการเปลี่ยนแปลงและช่วยให้คุณสามารถ "ส่ง" การเปลี่ยนแปลงของคุณกลับไปที่เซิร์ฟเวอร์ได้ สิ่งนี้คล้ายกับบริการ RIA สำหรับ Silverlight ฉันจะใช้บริการข้อมูล WCF แทนบริการ RIA แต่ในขณะนั้นยังไม่รองรับ DataAnnotations หรือ Actions แต่ตอนนี้ใช้แล้ว :) WCF Data Services มีข้อดีอีกอย่างหนึ่งเหนือบริการ RIA ซึ่งก็คือความสามารถในการดำเนินการ "ประมาณการ" จากลูกค้า สิ่งนี้สามารถช่วยในเรื่องประสิทธิภาพได้ในกรณีที่ฉันไม่ต้องการส่งคืนคุณสมบัติทั้งหมดจากเอนทิตี การมี "บริบทข้อมูล"
ดังนั้นบริการข้อมูล WCF จึงดีมากหากคุณมีข้อมูลที่มีความสัมพันธ์โดยเฉพาะอย่างยิ่งถ้าคุณใช้ SQL Server และ Entity Framework คุณจะสามารถเปิดเผยข้อมูล + การดำเนินการที่สืบค้นได้อย่างรวดเร็ว (การเรียกเพื่อเรียกใช้การดำเนินการเช่นเวิร์กโฟลว์กระบวนการพื้นหลัง) ผ่าน REST ที่มีโค้ดน้อยมาก WCF Data Services เพิ่งอัปเดต เปิดตัวรุ่นใหม่ ตรวจสอบฟังก์ชันการทำงานใหม่ทั้งหมด
ข้อเสียของ WCF Data Services คือ "การควบคุม" ที่คุณปล่อยผ่าน HTTP Stack ฉันพบข้อบกพร่องที่ใหญ่ที่สุดคือในIQueryable<T>
วิธีการที่ส่งคืนคอลเล็กชัน ซึ่งแตกต่างจากบริการ RIA และ WebApi คุณไม่มีสิทธิ์เข้าถึงอย่างเต็มที่เพื่อพัฒนาตรรกะในวิธีการ IQueryable ใน RIA บริการและ WebAPI IQueryable<T>
คุณสามารถเขียนสิ่งที่คุณต้องการรหัสตราบเท่าที่คุณกลับมา ใน WCF Data Services คุณจะเข้าถึงเพื่อต่อท้ายคำชี้แจง "Where" โดยใช้Expression<Func<T,bool>>
วิธีการดักฟัง เจอแบบนี้น่าผิดหวัง แอปพลิเคชันปัจจุบันของเราใช้บริการ RIA และฉันพบว่าเราต้องการความสามารถในการควบคุมตรรกะที่ชาญฉลาด ฉันหวังว่าฉันจะคิดผิดในเรื่องนี้และฉันพลาดอะไรไป
นอกจากนี้บริการข้อมูล WCF ยังไม่รองรับ LINQ Operators ทั้งหมดอย่างเต็มที่ แต่ยังรองรับมากกว่า WebApi
แล้ว WebApi ล่ะ ???
- ฉันชอบการควบคุม Http Request / Response
- ทำตามได้ง่าย (ใช้ประโยชน์จากรูปแบบ MVC) ฉันมั่นใจว่าจะมีเครื่องมือเพิ่มขึ้น
ณ ตอนนี้ (ตามความเข้าใจของฉัน) ไม่มีการสนับสนุน "บริบทข้อมูล" บนไคลเอนต์ (เช่น Silverlight, ASP.NET Server-Side Code เป็นต้น) เนื่องจาก WebApi ไม่ได้เกี่ยวกับโมเดลข้อมูลเอนทิตีเช่น WCF Data Services / OData คือ. สามารถแสดงคอลเล็กชันของ Model Objects โดยใช้ IQueryable / IEnumerable แต่ไม่มี "คุณสมบัติการนำทาง" ของคีย์หลัก / คีย์ต่างประเทศ (เช่นลูกค้าใบแจ้งหนี้) ให้ใช้เมื่อเอนทิตีโหลดบนไคลเอนต์เนื่องจากไม่มี "บริบทข้อมูล" ซึ่งโหลดแบบอะซิงโครนัส (หรือในการโทรครั้งเดียวโดยใช้ $ expand) และจัดการการเปลี่ยนแปลง คุณไม่มี "การแสดง" แบบจำลองข้อมูลเอนทิตีของคุณที่สร้างรหัสบนไคลเอนต์เช่นเดียวกับที่คุณทำในบริการ RIA หรือบริการข้อมูล WCF ฉันไม่ได้บอกว่าคุณไม่มี / ไม่มีโมเดลในไคลเอนต์ที่แสดงถึงข้อมูลของคุณ แต่คุณได้เติมข้อมูลด้วยตนเองและจัดการว่าจะกำหนด "ใบแจ้งหนี้" ใดให้กับ "ลูกค้า" แต่ละรายเมื่อพวกเขาถูกเรียกค้นผ่านเว็บ สิ่งนี้อาจเป็นเรื่องยุ่งยากโดยเฉพาะกับสิ่งต่างๆของ Async ที่เกิดขึ้น คุณไม่รู้ว่าสายใดจะกลับมาก่อน อาจอธิบายได้ยากที่นี่ แต่อ่านเกี่ยวกับเนื้อหา "บริบทข้อมูล" ในบริการ RIA หรือบริการข้อมูล WCF ดังนั้นเมื่อต้องจัดการกับแอพ Line of Business นี่เป็นปัญหาหลักสำหรับฉัน ขึ้นอยู่กับผลผลิตและการบำรุงรักษาเป็นหลัก คุณสามารถสร้างแอปแบบสุ่มโดยไม่ต้องใช้บริบทข้อมูล มันทำให้สิ่งต่างๆง่ายขึ้นโดยเฉพาะใน Silverlight, WPF และตอนนี้ Windows 8 Metro การมีเอนทิตีเชิงสัมพันธ์โหลดลงในหน่วยความจำแบบอะซิงโครนัสและการมี Two-Binding เป็นสิ่งที่ดีจริงๆ
ต้องบอกว่านี่หมายความว่าบางวัน WebApi สามารถรองรับ "บริบทข้อมูล" บนไคลเอนต์ได้หรือไม่? ฉันคิดว่ามันทำได้ นอกจากนี้ด้วยการใช้เครื่องมือที่มากขึ้นโครงการ Visual Studio สามารถสร้างวิธีการ CRUD ทั้งหมดของคุณตามสคีมาฐานข้อมูล (หรือกรอบเอนทิตี)
นอกจากนี้ฉันรู้ว่าฉันพูดถึง. NET ถึง. NET Frameworks เท่านั้นเมื่อต้องทำงานกับ WCF Data Services หรือ WebApi แต่ฉันทราบดีว่า HTML / JS เป็นผู้เล่นหลักเช่นกัน ฉันแค่พูดถึงประโยชน์ที่ฉันพบเมื่อจัดการกับ Silverlight UI หรือ ASP.NET Server-Side Code เป็นต้นฉันเชื่อด้วยการกำเนิดของ "IndexedDB" ใน HTML5 / JavaScript ที่มี "บริบทข้อมูล" และ กรอบงาน LINQ ใน JavaScript สามารถใช้งานได้ทำให้ความสามารถในการสืบค้น OData Services ง่ายยิ่งขึ้นจาก JavaScript (คุณสามารถใช้ DataJS วันนี้กับ OData) นอกจากนี้การใช้ KnockoutJS เพื่อรองรับ MVVM และ Binding ใน HTML / JS ด้วยจะทำให้เป็นเรื่องง่าย :)
ฉันกำลังหาข้อมูลว่าจะใช้แพลตฟอร์มใด ฉันมีความสุขที่ได้ใช้อย่างใดอย่างหนึ่ง แต่ฉันมักจะพึ่งพา OData จากข้อเท็จจริงที่ว่าแอปพลิเคชันถัดไปของฉันเป็นพื้นฐานเกี่ยวกับ Analytics (อ่านอย่างเดียว) และฉันต้องการ RESTful Api ที่มีความสมบูรณ์ ฉันเชื่อว่า OData + WCF Data Services ให้ฉันได้เพราะ WebApi รองรับเฉพาะ $ take, $ skip, $ filter, $ orderby ผ่าน Collections ไม่รองรับ Projections, Includes ($ expand) และอื่น ๆ ฉันไม่มี "Updates / Deletes / Inserts" มากนักและข้อมูลของเราค่อนข้างมีความสัมพันธ์กัน
ฉันหวังว่าคนอื่น ๆ จะเข้าร่วมในการอภิปรายและแสดงความคิดเห็น ฉันยังคงตัดสินใจและชอบที่จะรับฟังความคิดเห็นอื่น ๆ ฉันคิดว่าทั้งสองอย่างเป็นกรอบที่ยอดเยี่ยม ฉันสงสัยว่าคุณต้องเลือกทำไมไม่ใช้ทั้งสองอย่างถ้าจำเป็น จากไคลเอนต์ทุกอย่างเกี่ยวกับการสร้างการเรียก REST อย่างไรก็ตาม แค่คิด :)