จะเพิ่ม Web API ในโครงการ ASP.NET MVC 4 Web Application ที่มีอยู่ได้อย่างไร


365

ฉันต้องการเพิ่มASP.NET Web APIในโครงการ ASP.NET MVC 4 Web Application ที่พัฒนาใน Visual Studio 2012 ฉันต้องดำเนินการขั้นตอนใดเพื่อเพิ่ม Web API ที่ใช้งานได้ให้กับโครงการ ฉันรู้ว่าฉันต้องการคอนโทรลเลอร์ที่มาจาก ApiController แต่นั่นคือทั้งหมดที่ฉันรู้

แจ้งให้เราทราบหากฉันต้องการให้รายละเอียดเพิ่มเติม

คำตอบ:


455

ขั้นตอนที่ฉันต้องดำเนินการคือ:

  1. System.Web.Http.WebHostเพิ่มการอ้างอิงถึง
  2. เพิ่มApp_Start\WebApiConfig.cs(ดูข้อมูลโค้ดด้านล่าง)
  3. นำเข้า namespace ในSystem.Web.HttpGlobal.asax.cs
  4. โทรWebApiConfig.Register(GlobalConfiguration.Configuration)เข้าMvcApplication.Application_Start()(เป็นไฟล์Global.asax.cs) ก่อนที่จะลงทะเบียนเส้นทางเว็บแอปพลิเคชันเริ่มต้นตามที่จะมีความสำคัญกว่า
  5. System.Web.Http.ApiControllerเพิ่มตัวควบคุมที่เกิดจากการ

จากนั้นฉันสามารถเรียนรู้พอจากบทช่วยสอน (Your First ASP.NET Web API) เพื่อกำหนดตัวควบคุม API ของฉัน

App_Start \ WebApiConfig.cs:

using System.Web.Http;

class WebApiConfig
{
    public static void Register(HttpConfiguration configuration)
    {
        configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{id}",
            new { id = RouteParameter.Optional });
    }
}

Global.asax.cs:

using System.Web.Http;

...

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    WebApiConfig.Register(GlobalConfiguration.Configuration);
    RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

อัพเดท 10.16.2015:

Word มีมันแพคเกจ NuGet Microsoft.AspNet.WebApi จะต้องติดตั้งเพื่อให้ทำงานได้


12
มันมีประโยชน์จริงๆ ฉันต้องเพิ่มการอ้างอิงSystem.Net.Httpด้วยเช่นกัน แต่นอกเหนือจากนั้นมันใช้งานได้อย่างมีเสน่ห์!
Christofer Eliasson

5
ฉันอัพเกรดโครงการจาก MVC3 เป็น 4 เช่นกันและยังจำเป็นต้องเพิ่มการอ้างอิงไปยัง System.Web.Http
ดาเมียนซอว์เยอร์

3
คุณสามารถใช้ nuget ได้แล้วและติดตามการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้น! nuget.org/packages/Microsoft.AspNet.WebApi
Chris

3
ฉันจะไม่ให้มันทำงานจนกว่าฉันจะเปลี่ยนเว็บ api ของฉันลงทะเบียนเป็น: GlobalConfiguration.Configure (WebApiConfig.Register);
KingOfHypocrites

3
@ LuisGouveia ฉันเดาว่ามันจะสาย แต่คนอื่นอาจจะแก้ไขได้เร็วขึ้นถ้านี่คือสิ่งที่ฉันมี GlobalConfiguration.Configure (WebApiConfig.Register); ใน Global.asax ไปก่อน RouteConfig.RegisterRoutes (RouteTable.Routes);
Maxim

77

UPDATE 11/22/2013 - นี่คือแพ็คเกจ WebApi ล่าสุด:

Install-Package Microsoft.AspNet.WebApi

คำตอบเดิม (นี่เป็นแพ็คเกจ WebApi ที่เก่ากว่า)

Install-Package AspNetWebApi

เพิ่มเติมรายละเอียด


3
ตั้งแต่ปี 2013 นั่นเป็นแพคเกจเดิมและคุณต้องการInstall-Package Microsoft.AspNet.WebApiตอนนี้ ดูnuget.org/packages/Microsoft.AspNet.WebApi
Chris

70

ในการเพิ่ม WebAPI ในโครงการ MVC 5 ของฉัน

  1. เปิดคอนโซลตัวจัดการแพคเกจ NuGet และเรียกใช้

    PM> Install-Package Microsoft.AspNet.WebApi
  2. เพิ่มการอ้างอิงไปSystem.Web.Routing, System.Web.NetและSystem.Net.Httpกำลังถ้าไม่ได้มีอยู่แล้ว

  3. คลิกขวาที่โฟลเดอร์ตัวควบคุม> เพิ่มรายการใหม่> เว็บ> เพิ่มตัวควบคุม Web API

  4. Web.config จะถูกแก้ไขตามด้วย VS

  5. เพิ่มApplication_Startวิธีถ้ายังไม่มี

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  6. เพิ่มคลาสต่อไปนี้ (ฉันเพิ่มในไฟล์ global.asax.cs)

    public static class WebApiConfig
    {
         public static void Register(HttpConfiguration config)
         {
             // Web API routes
             config.MapHttpAttributeRoutes();
    
             config.Routes.MapHttpRoute(
                 name: "DefaultApi",
                 routeTemplate: "api/{controller}/{id}",
                 defaults: new { id = RouteParameter.Optional }
             );
         }
     }
  7. แก้ไขเมธอด web api ตามนั้น

    namespace <Your.NameSpace.Here>
    {
        public class VSController : ApiController
        {
            // GET api/<controller>   : url to use => api/vs
            public string Get()
            {
                return "Hi from web api controller";
            }
    
            // GET api/<controller>/5   : url to use => api/vs/5
            public string Get(int id)
            {
                return (id + 1).ToString();
            }
        }
    }
  8. สร้างและทดสอบใหม่

  9. สร้างหน้า html ง่าย ๆ

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>    
        <script src="../<path_to_jquery>/jquery-1.9.1.min.js"></script>
        <script type="text/javascript">
            var uri = '/api/vs';
            $(document).ready(function () {
                $.getJSON(uri)
                .done(function (data) {
                    alert('got: ' + data);
                });
    
                $.ajax({
                    url: '/api/vs/5',
                    async: true,
                    success: function (data) {
                        alert('seccess1');
                        var res = parseInt(data);
                        alert('got res=' + res);
                    }
                });
            });
        </script>
    </head>
    <body>
    ....
    </body>
    </html>

จุดที่สร้างความแตกต่างคือการวาง WebApiconfig.Register ในบรรทัดแรกตามที่ได้รับการกล่าวถึงโดย @kheya
Rajat

ฉันต้องการเพิ่มชื่อผู้ควบคุม api ของคุณต้องจบด้วยControllerเช่นCarController (ไม่ใช่แค่รถยนต์ ) !!! ผู้คนจำนวนมากลืมมันและได้รับข้อความแสดงข้อผิดพลาด"ไม่พบประเภทที่ตรงกับตัวควบคุมที่ชื่อ {0} '"
1_bug

เพื่อให้มีประสิทธิภาพมากขึ้นด้วยคำตอบที่ดีนี้คุณสามารถเพิกเฉยต่อขั้นตอนที่ 4, 8 และ 9 (พวกมันไม่จำเป็น) และถ้าคุณสลับลำดับขั้นตอนที่ 5 และ 6 พวกเขาจะเข้าใจมากขึ้น (ควรสร้างชั้นเรียนแล้ว ใช้มันแทนการใช้คลาสแล้วสร้างมันขึ้นมา)
Hakan Fıstık

เราจะเพิ่มการอ้างอิงไปยัง System.Web.Routing, System.Web.Net และ System.Net.Http ที่ไหน
gabed123

28

ทันทีที่คุณเพิ่ม "ตัวควบคุม WebApi" ภายใต้โฟลเดอร์ตัวควบคุม Visual Studio จะดูแลการพึ่งพาโดยอัตโนมัติ

Visual Studio ได้เพิ่มชุดการอ้างอิงเต็มรูปแบบสำหรับ ASP.NET Web API 2 เข้ากับโครงการ 'MyTestProject'

ไฟล์ Global.asax.cs ในโครงการอาจต้องการการเปลี่ยนแปลงเพิ่มเติมเพื่อเปิดใช้งาน ASP.NET Web API

  1. เพิ่มการอ้างอิงเนมสเปซต่อไปนี้:

    ใช้ System.Web.Http; ใช้ System.Web.Routing;

  2. หากรหัสยังไม่ได้กำหนดวิธี Application_Start ให้เพิ่มวิธีการต่อไปนี้:

    โมฆะป้องกัน Application_Start () {}

  3. เพิ่มบรรทัดต่อไปนี้ไปยังจุดเริ่มต้นของเมธอด Application_Start:

    GlobalConfiguration.Configure (WebApiConfig.Register);


นี่เป็นวิธีที่ง่ายที่สุดในการบรรลุเป้าหมายในตอนนี้
Adam Smith

1
ไม่ทำงานที่นี่ 1. Nuget: Install-Package Microsoft.AspNet.WebApi2. เพิ่มรายการใหม่ "Web API Controller Class (v2.1)" ผล: เพิ่มตัวควบคุม API Application_Startแต่ไม่เปลี่ยนแปลง กับโอวิน
Artyom

2
นี่เป็นคำตอบที่ถูกต้องเมื่อคุณมี vs2015 - อัพเดต 3 และเพิ่มตัวควบคุมเว็บ api 2
ModChowdhury

มันทำในปี 2560 แต่ฉันต้องอัพเกรดชุดประกอบ WebApi ของฉัน ฉันยังต้องสร้างคลาส WebApiConfig ด้วยตัวเองdocs.microsoft.com/en-us/aspnet/web-api/overview/advanced/…
johnny

22

คุณสามารถติดตั้งจาก nuget เป็นภาพด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่

หรือเรียกใช้บรรทัดคำสั่งด้านล่างบน Package Manager Console:

Install-Package Microsoft.AspNet.WebApi

3
ดังนั้นฉันต้องทำอะไรนอกจากเพิ่มคอนโทรลเลอร์? นี่คือเหตุผลที่ฉันโพสต์คำถามนี้ตั้งแต่แรกบทช่วยสอนไม่ได้พูดจริง ๆ เพราะถือว่าเป็นโครงการ Web API ฉันได้เพิ่มตัวควบคุม API แต่ไม่มีการกำหนดเส้นทาง
aknuds1

1
บทช่วยสอนไม่ได้ช่วยอะไรมากมายเกี่ยวกับการเพิ่ม Web API เข้ากับโครงการที่มีอยู่ดังนั้นฉันจึงหาคำตอบได้จากโครงการ Web API ตามที่ระบุไว้ในคำตอบของฉัน
aknuds1

ฉันเห็นด้วยดูเหมือนว่าระบบประปานี้ได้รับการติดตั้งแล้วหากคุณใช้เทมเพลตโครงการ Web App
longda

@cuongle: web api เวอร์ชั่น 2.2 จะถูกติดตั้งด้วย mvc 4 หรือไม่ รองรับ MVC 4 หรือไม่
โทมัส

20

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

หากคุณต้องการใช้คำขอที่ได้รับการรับรองความถูกต้องทั้ง MVC และ Web API คุณต้องจำไว้ว่า Web API นั้นสงบ (ไม่จำเป็นต้องเก็บเซสชันคำขอ HTTP แบบง่าย ฯลฯ ) แต่ MVC ไม่ใช่

ในการดูความแตกต่างของการใช้งานเพียงแค่สร้าง 2 โครงการที่แตกต่างกันใน Visual Studio 2013 จากเทมเพลต: หนึ่งรายการสำหรับ MVC และอีกหนึ่งสำหรับ Web API (อย่าลืมเปิด "การรับรองความเป็นบุคคล" ในระหว่างการสร้าง) คุณจะเห็นความแตกต่างมากมายใน AuthencationControllers

ดังนั้นระวัง


11

หมายเหตุ: นี่เป็นเพียงคำย่อของคำตอบนี้ด้านบน

  1. เปิดคอนโซลตัวจัดการแพคเกจ NuGet และเรียกใช้

    PM> Install-Package Microsoft.AspNet.WebApi
  2. เพิ่มการอ้างอิงไปSystem.Web.Routing, System.Web.NetและSystem.Net.Httpกำลังถ้าไม่ได้มีอยู่แล้ว

  3. เพิ่มคลาสต่อไปนี้

    public static class WebApiConfig
    {
         public static void Register(HttpConfiguration config)
         {
             // Web API routes
             config.MapHttpAttributeRoutes();
    
             config.Routes.MapHttpRoute(
                 name: "DefaultApi",
                 routeTemplate: "api/{controller}/{id}",
                 defaults: new { id = RouteParameter.Optional }
             );
         }
     }
  4. เพิ่มApplication_Startวิธีถ้ายังไม่มี (ในไฟล์ global.asax.cs)

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  5. คลิกขวาที่โฟลเดอร์ตัวควบคุม> เพิ่มรายการใหม่> เว็บ> เพิ่มตัวควบคุม Web API

    namespace <Your.NameSpace.Here>
    {
        public class VSController : ApiController
        {
            // GET api/<controller>   : url to use => api/vs
            public string Get()
            {
                return "Hi from web api controller";
            }  
        }
    }

เราจะเพิ่มการอ้างอิงไปยัง System.Web.Routing, System.Web.Net และ System.Net.Http ที่ไหน
gabed123

1
จากไดอะล็อกเพิ่มการอ้างอิงเปิดไดอะล็อกนั้นและค้นหาชื่อของชุดประกอบเหล่านั้นมีโอกาสที่ดีที่พวกมันจะถูกเพิ่มเข้าไปแล้ว (แต่เพื่อความแน่ใจ)
Hakan Fıstık

Application_Start วิธีการที่ควรจะเป็นส่วนหนึ่งของระดับโลกใน Global.asax.cs?
gabed123

ใช่ฉันอัปเดตคำตอบของฉันเพื่อแสดงให้เห็นว่าคุณทราบ
Hakan Fıstık

1
@HakamFostok สิ่งนี้ช่วยฉัน ขอบคุณ!
csichar

3

วิธีการแก้ปัญหาข้างต้นทำงานได้อย่างสมบูรณ์ ฉันต้องการเลือกตัวเลือก Web API ในขณะที่เลือกเทมเพลตโครงการดังที่แสดงในภาพด้านล่าง

หมายเหตุ:การแก้ปัญหาทำงานได้กับ Visual Studio 2013 หรือสูงกว่า คำถามต้นฉบับถูกถามในปี 2012 และเป็นปี 2559 ดังนั้นจึงเป็นการเพิ่มโซลูชัน Visual Studio 2013 ขึ้นไป

เทมเพลตโครงการแสดงตัวเลือกเว็บ API


2
หากคุณกำลังสร้างโครงการที่เกี่ยวข้องกับ Web API จะเป็นการง่ายกว่าที่จะเลือกตัวเลือก Web API ตัวเลือกจะสร้างไฟล์ที่จำเป็นทั้งหมดตามที่ระบุไว้ในคำตอบข้างต้น
Sankar Krishnamoorthy

ปัญหาที่เกิดขึ้นที่นี่อยู่ใน Visual Studio 2012 และ mvc 4 แม้ว่าโซลูชันของคุณจะใช้ได้ แต่คุณไม่สามารถทำได้ใน VS 2012
netfed

นี่เป็นจุดที่ดีและฉันได้ลองวิธีแก้ปัญหาข้างต้นกับ VS 2013 ขอบคุณ @netfed สำหรับการชี้ให้เห็น
Sankar Krishnamoorthy

สวัสดีทุกคนฉันมีองค์ประกอบ API ทำงานในโซลูชัน MVC ของฉันแล้ว แต่ตามค่าเริ่มต้นแล้วก็พยายามเรียกใช้โซลูชันเป็นโซลูชัน API แต่ฉันต้องการให้มันทำงานเป็นวิธีแก้ปัญหา MVC เป็นค่าเริ่มต้นและถ้าคุณไปที่ตำแหน่ง API ฯลฯ ให้เรียกใช้ API .. มีใครเคยมีปัญหานี้อีกและสามารถแก้ไขได้หรือไม่ ขอบคุณ
Chris Cooper

1

ฉันมีปัญหาเดียวกันการแก้ปัญหานั้นง่ายมาก

คลิกขวาที่ solotion ติดตั้ง Microsoft.ASP.NET.WebApi จาก "จัดการแพคเกจ Nuget สำหรับ Sulotion"

บูมนั่นแหล่ะ;)

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