Làm cách nào để thêm API Web vào dự án Ứng dụng web ASP.NET MVC 4 hiện có?


365

Tôi muốn thêm API Web ASP.NET vào dự án Ứng dụng web ASP.NET MVC 4, được phát triển trong Visual Studio 2012. Tôi phải thực hiện các bước nào để thêm API Web hoạt động vào dự án? Tôi biết rằng tôi cần một bộ điều khiển xuất phát từ ApiControll, nhưng đó là tất cả những gì tôi biết.

Hãy cho tôi biết nếu tôi cần cung cấp thêm chi tiết.

Câu trả lời:


455

Các bước tôi cần thực hiện là:

  1. Thêm tài liệu tham khảo System.Web.Http.WebHost.
  2. Thêm App_Start\WebApiConfig.cs(xem đoạn mã dưới đây).
  3. Nhập không gian tên System.Web.Httptrong Global.asax.cs.
  4. Gọi WebApiConfig.Register(GlobalConfiguration.Configuration)trong MvcApplication.Application_Start()(trong tập tin Global.asax.cs), trước khi đăng ký con đường ứng dụng Web mặc định như mà nếu không sẽ được ưu tiên.
  5. Thêm một bộ điều khiển xuất phát từ System.Web.Http.ApiController.

Sau đó tôi có thể học đủ từ hướng dẫn (API Web ASP.NET đầu tiên của bạn) để xác định trình điều khiển API của mình.

Ứng dụng_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 });
    }
}

Toàn cầu.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);
}

Cập nhật 10.16.2015:

Word có nó, gói NuGet Microsoft.AspNet.WebApi phải được cài đặt để ở trên hoạt động.


12
Điều này thực sự hữu ích. Tôi đã phải thêm một tài liệu tham khảo System.Net.Httpnữa, nhưng ngoài ra, nó hoạt động như một cơ duyên!
Christofer Eliasson

5
Tôi cũng đã nâng cấp một dự án từ MVC3 lên 4 và cũng cần thêm một tham chiếu đến System.Web.Http.
Damien Sawyer

3
Bạn có thể sử dụng nuget ngay bây giờ và luôn cập nhật mọi thay đổi xảy ra! nuget.org/packages/Microsoft.AspNet.WebApi
Chris

3
Tôi sẽ không làm việc này cho đến khi tôi thay đổi đăng ký api web của mình thành: GlobalConfiguration.Configure (WebApiConfig.Register);
KingOfHypocites

3
@LuisGouveia Tôi đoán là sẽ muộn nhưng người khác có thể sẽ giải quyết nhanh hơn nếu đây là những gì tôi có. GlobalConfiguration.Configure (WebApiConfig.Register); trong Global.asax đi trước RouteConfig.RegisterRoutes (RouteTable.Routes);
Maxim

77

CẬP NHẬT 22/11/2013 - đây là gói WebApi mới nhất:

Install-Package Microsoft.AspNet.WebApi

Câu trả lời gốc (đây là gói WebApi cũ hơn)

Install-Package AspNetWebApi

Thêm chi tiết .


3
Kể từ năm 2013, đó là một gói di sản và bạn muốn Install-Package Microsoft.AspNet.WebApingay bây giờ. Xem nuget.org/packages/Microsoft.AspNet.WebApi
Chris

70

Để thêm WebAPI trong dự án MVC 5 của tôi.

  1. Mở bảng điều khiển quản lý gói NuGet và chạy

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Thêm tham chiếu đến System.Web.Routing, System.Web.NetSystem.Net.Httpdlls nếu không đã có

  3. Nhấp chuột phải vào thư mục bộ điều khiển> thêm mục mới> web> Thêm bộ điều khiển API Web

  4. Web.config sẽ được sửa đổi cho phù hợp bởi VS

  5. Thêm Application_Startphương thức nếu chưa có

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  6. Thêm lớp sau (Tôi đã thêm vào tệp 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. Sửa đổi phương pháp api web phù hợp

    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. Xây dựng lại và kiểm tra

  9. Xây dựng một trang html đơn giản

    <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>

Điểm tạo ra sự khác biệt là đặt WebApiconfig.Register ở dòng đầu tiên, như được đề cập bởi @kheya
Rajat

Tôi muốn thêm, tên bộ điều khiển api của bạn phải kết thúc bằng Bộ điều khiển , như CarContoder (không chỉ Car ) !!! Vì vậy, nhiều người quên nó và nhận được thông báo lỗi "Không tìm thấy loại nào phù hợp với bộ điều khiển có tên {0} '"
1_ bọ

Để hiệu quả hơn với câu trả lời hay này, bạn có thể bỏ qua các bước 4, 8 và 9. (chúng không quá cần thiết) Và nếu bạn trao đổi thứ tự của bước 5 và 6, chúng sẽ có ý nghĩa hơn (tốt hơn là tạo một lớp sau đó sử dụng nó, thay vì sử dụng lớp sau đó tạo nó)
Hakan Fıstık

Chính xác thì chúng ta đang thêm các tham chiếu đến System.Web.Routing, System.Web.Net và System.Net.Http ở đâu?
gabed123

28

Ngay khi bạn thêm "Trình điều khiển WebApi" trong thư mục bộ điều khiển, Visual Studio sẽ tự động xử lý các phụ thuộc;

Visual Studio đã thêm bộ phụ thuộc đầy đủ cho ASP.NET Web API 2 vào dự án 'MyTestProject'.

Tệp Global.asax.cs trong dự án có thể yêu cầu thay đổi bổ sung để bật API Web ASP.NET.

  1. Thêm các tham chiếu không gian tên sau đây:

    sử dụng System.Web.Http; sử dụng System.Web.Routing;

  2. Nếu mã chưa xác định phương thức Application_Start, hãy thêm phương thức sau:

    được bảo vệ void Application_Start () {}

  3. Thêm các dòng sau vào đầu phương thức Application_Start:

    GlobalConfiguration.Configure (WebApiConfig.Register);


Đây là cách dễ nhất để đạt được điều này ngay bây giờ.
Adam Smith

1
Không làm việc ở đây. 1. Nuget: Install-Package Microsoft.AspNet.WebApi2. Thêm mục mới "Lớp trình điều khiển API Web (v2.1)". Kết quả: thêm bộ điều khiển api nhưng không thay đổi Application_Start. Với Owin.
Artyom

2
Đây là câu trả lời đúng khi bạn có vs2015 - cập nhật 3 và thêm trình điều khiển web api 2.
ModChowdhury

Nó đã làm vào năm 2017, nhưng tôi đã phải nâng cấp các hội đồng WebApi của mình. Tôi cũng phải tạo lớp WebApiConfig theo cách thủ công, docs.microsoft.com/en-us/aspnet/web-api/overview/advified/ọ
johnny

22

Bạn có thể cài đặt từ nuget như hình ảnh dưới đây:

nhập mô tả hình ảnh ở đây

Hoặc, chạy dòng lệnh dưới đây trên Bảng điều khiển quản lý gói:

Install-Package Microsoft.AspNet.WebApi

3
Vì vậy, tôi cần phải làm gì khác ngoài việc thêm bộ điều khiển? Đây là lý do tại sao tôi đã đăng câu hỏi này ngay từ đầu, hướng dẫn không thực sự nói vì nó giả định một dự án API Web. Tôi đã thêm một bộ điều khiển API, nhưng nó không được định tuyến đến.
aknuds1

1
Hướng dẫn này không giúp ích nhiều về việc thêm API Web vào một dự án hiện có, vì vậy tôi đã tìm ra nó từ một dự án API Web, như được nêu trong câu trả lời của tôi.
aknuds1

Tôi đồng ý, có vẻ như hệ thống ống nước này đã được cài đặt nếu bạn sử dụng mẫu dự án Ứng dụng Web.
longda

@cuongle: web api phiên bản 2.2 sẽ được cài đặt với mvc 4? Nó có hỗ trợ MVC 4 không?
Thomas

20

Trước khi bạn bắt đầu hợp nhất các dự án MVC và Web API, tôi khuyên bạn nên đọc về nhược điểm và ưu điểm để tách chúng thành các dự án khác nhau. Một điều rất quan trọng (của riêng tôi) là các hệ thống xác thực, hoàn toàn khác nhau.

NẾU bạn cần sử dụng các yêu cầu được xác thực trên cả MVC và Web API, bạn cần nhớ rằng API Web là RESTful (không cần giữ phiên, các yêu cầu HTTP đơn giản, v.v.), nhưng MVC thì không.

Để xem xét sự khác biệt của việc triển khai, chỉ cần tạo 2 dự án khác nhau trong Visual Studio 2013 từ Mẫu: một cho MVC và một cho API Web (đừng quên bật "Xác thực cá nhân" trong khi tạo). Bạn sẽ thấy rất nhiều sự khác biệt trong AuthencationControllers.

Vì vậy, hãy lưu ý.


11

LƯU Ý: đây chỉ là viết tắt của câu trả lời này ở trên

  1. Mở bảng điều khiển quản lý gói NuGet và chạy

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Thêm tham chiếu đến System.Web.Routing, System.Web.NetSystem.Net.Httpdlls nếu không đã có

  3. Thêm lớp sau

    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. Thêm Application_Startphương thức nếu chưa có (trong tệp global.asax.cs)

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  5. Nhấp chuột phải vào thư mục bộ điều khiển> thêm mục mới> web> Thêm bộ điều khiển API Web

    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";
            }  
        }
    }

Chính xác thì chúng ta đang thêm các tham chiếu đến System.Web.Routing, System.Web.Net và System.Net.Http ở đâu?
gabed123

1
Từ hộp thoại Thêm tham chiếu, mở đoạn hội thoại đó và tìm kiếm tên của các hội đồng đó, rất có thể chúng đã được thêm vào. (nhưng chỉ để đảm bảo)
Hakan Fıstık

Phương thức Application_Start có phải là một phần của lớp toàn cầu trong Global.asax.cs không?
gabed123

vâng, tôi đã cập nhật câu trả lời của mình để chứng minh rằng, bạn đã ghi chú
Hakan Fıstık

1
@HakamFostok Điều này đã giúp tôi. Cảm ơn bạn!
csichar

3

Các giải pháp trên hoạt động hoàn hảo. Tôi thích chọn tùy chọn API Web trong khi chọn mẫu dự án như trong hình bên dưới

Lưu ý: Giải pháp hoạt động với Visual Studio 2013 trở lên. Câu hỏi ban đầu đã được hỏi vào năm 2012 và đó là năm 2016, do đó thêm giải pháp Visual Studio 2013 trở lên.

Mẫu dự án hiển thị tùy chọn API web


2
Nếu bạn đang tạo một dự án liên quan đến API Web, việc chọn tùy chọn API Web sẽ dễ dàng hơn. Tùy chọn sẽ tạo tất cả các tệp cần thiết như được đề cập trong các câu trả lời ở trên.
Sankar KRnamoorthy

Vấn đề hiện tại là ở Visual studio 2012 và mvc 4. Mặc dù giải pháp của bạn rất ổn, nhưng bạn không thể làm theo cách đó trong VS 2012
netfed

Đây là một điểm tốt và tôi đã thử giải pháp trên với VS 2013. Cảm ơn @netfed đã chỉ ra.
Sankar KRnamoorthy

Xin chào, tôi đã có phần tử API hoạt động trong giải pháp MVC của mình, nhưng theo mặc định, nó đã cố chạy giải pháp này dưới dạng giải pháp API. Nhưng tôi muốn nó chạy như một giải pháp MVC như mặc định và sau đó nếu bạn đi đến vị trí API, v.v., hãy chạy API .. Có ai khác gặp phải vấn đề này và có thể giải quyết nó không? Cảm ơn
Chris Cooper

1

Tôi đã có cùng một vấn đề, giải pháp rất dễ dàng

Nhấp chuột phải vào solotion cài đặt Microsoft.ASP.NET.WebApi từ "Quản lý gói Nuget cho Sulotion"

bùng nổ đó;)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.