Bagaimana cara menambahkan API Web ke proyek Aplikasi Web ASP.NET MVC 4 yang ada?

365

Saya ingin menambahkan ASP.NET Web API ke proyek Aplikasi Web ASP.NET MVC 4, yang dikembangkan di Visual Studio 2012. Langkah-langkah apa yang harus saya lakukan untuk menambahkan API Web yang berfungsi ke proyek? Saya sadar bahwa saya memerlukan controller yang berasal dari ApiController, tapi hanya itu yang saya tahu.

Beri tahu saya jika saya perlu memberikan detail lebih lanjut.

aknuds1
sumber

Jawaban:

455

Langkah-langkah yang perlu saya lakukan adalah:

  1. Tambahkan referensi ke System.Web.Http.WebHost.
  2. Tambahkan App_Start\WebApiConfig.cs(lihat cuplikan kode di bawah).
  3. Impor namespace System.Web.Httpdi Global.asax.cs.
  4. Hubungi WebApiConfig.Register(GlobalConfiguration.Configuration)di MvcApplication.Application_Start()(dalam file Global.asax.cs), sebelum mendaftar default rute Aplikasi Web sebagai yang lain akan didahulukan.
  5. Tambahkan pengontrol yang berasal dari System.Web.Http.ApiController.

Saya kemudian bisa belajar cukup dari tutorial (ASP.NET Web API Pertama Anda) untuk menentukan pengontrol API saya.

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

Pembaruan 10.16.2015:

Word memilikinya, paket NuGet Microsoft.AspNet.WebApi harus diinstal untuk bekerja di atas.

aknuds1
sumber
12
Ini sangat membantu. Saya harus menambahkan referensi System.Net.Httpjuga, tetapi selain itu, itu berfungsi seperti pesona!
Christofer Eliasson
5
Saya memutakhirkan proyek dari MVC3 ke 4 juga dan juga perlu menambahkan referensi ke System.Web.Http.
Damien Sawyer
3
Anda dapat menggunakan nuget sekarang, dan tetap mengikuti setiap perubahan yang terjadi! nuget.org/packages/Microsoft.AspNet.WebApi
Chris
3
Saya tidak akan mengaktifkan ini sampai saya mengubah daftar api web saya menjadi: GlobalConfiguration.Configure (WebApiConfig.Register);
KingOfHypocrites
3
@LuisGouveia Saya kira sudah terlambat tapi orang lain mungkin akan menyelesaikannya lebih cepat jika ini yang saya miliki. GlobalConfiguration.Configure (WebApiConfig.Register); di Global.asax berjalan sebelum RouteConfig.RegisterRoutes (RouteTable.Routes);
Maxim
77

PEMBARUAN 11/22/2013 - ini adalah paket WebApi terbaru:

Install-Package Microsoft.AspNet.WebApi

Jawaban asli (ini adalah paket WebApi yang lebih lama)

Install-Package AspNetWebApi

Lebih detail .

cdeutsch
sumber
3
Pada 2013 itu adalah paket warisan dan Anda inginkan Install-Package Microsoft.AspNet.WebApisekarang. Lihat nuget.org/packages/Microsoft.AspNet.WebApi
Chris
70

Untuk menambahkan WebAPI di proyek MVC 5 saya.

  1. Buka konsol pengelola Paket NuGet dan jalankan

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Tambahkan referensi System.Web.Routing, System.Web.Netdan System.Net.Httpdll jika belum ada di sana

  3. Klik kanan folder pengontrol> tambahkan item baru> web> Tambahkan pengontrol API Web

  4. Web.config akan dimodifikasi sesuai dengan VS

  5. Tambahkan Application_Startmetode jika belum ada di sana

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  6. Tambahkan kelas berikut (saya menambahkan dalam file 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. Ubah metode api web yang sesuai

    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. Bangun kembali dan uji

  9. Buat halaman html sederhana

    <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>
kheya
sumber
Titik yang menciptakan perbedaan adalah menempatkan WebApiconfig.Pendaftar di baris pertama, seperti yang disebutkan oleh @kheya
Rajat
Saya ingin menambahkan, nama pengontrol api Anda harus diakhiri dengan Pengontrol , seperti CarController (bukan hanya Mobil ) !!! Begitu banyak orang lupa tentang hal itu dan mendapatkan pesan kesalahan "Tidak ditemukan jenis yang cocok dengan pengontrol bernama {0} '"
1_bug
Agar lebih efisien dengan jawaban yang bagus ini Anda dapat mengabaikan langkah 4, 8 dan 9. (mereka tidak begitu penting) Dan jika Anda menukar urutan langkah 5 dan 6 mereka akan lebih masuk akal (lebih baik membuat kelas kemudian gunakan, alih-alih gunakan kelas, buat saja)
Hakan Fıstık
Di mana tepatnya kita menambahkan referensi ke System.Web.Routing, System.Web.Net dan System.Net.Http?
gabed123
28

Segera setelah Anda menambahkan "WebApi Controller" di bawah folder controllers, Visual Studio menangani dependensi secara otomatis;

Visual Studio telah menambahkan set lengkap dependensi untuk ASP.NET Web API 2 ke proyek 'MyTestProject'.

File Global.asax.cs dalam proyek ini mungkin memerlukan perubahan tambahan untuk mengaktifkan ASP.NET Web API.

  1. Tambahkan referensi namespace berikut:

    menggunakan System.Web.Http; menggunakan System.Web.Routing;

  2. Jika kode belum menentukan metode Application_Start, tambahkan metode berikut:

    void Application_Start () {} dilindungi

  3. Tambahkan baris berikut ke awal metode Application_Start:

    GlobalConfiguration.Configure (WebApiConfig.Register);

Teoman shipahi
sumber
Sejauh ini, ini adalah cara termudah untuk mencapai ini.
Adam Smith
1
Tidak bekerja di sini 1. Nuget: Install-Package Microsoft.AspNet.WebApi2. Tambahkan item baru "Kelas Pengontrol API Web (v2.1)". Hasil: menambahkan pengontrol api tetapi tidak berubah Application_Start. Dengan Owin.
Artyom
2
ini adalah jawaban yang tepat ketika Anda memiliki vs2015 - perbarui 3 dan tambahkan kontroler web api 2.
ModChowdhury
Itu terjadi pada tahun 2017, tetapi saya harus meningkatkan rakitan WebApi saya. Saya juga harus membuat kelas WebApiConfig secara manual, docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/…
johnny
22

Anda dapat menginstal dari nuget seperti gambar di bawah ini:

masukkan deskripsi gambar di sini

Atau, jalankan baris perintah di bawah ini di Package Manager Console:

Install-Package Microsoft.AspNet.WebApi
cuongle
sumber
3
Jadi, apa lagi yang harus saya lakukan selain menambahkan controller? Inilah mengapa saya memposting pertanyaan ini sejak awal, tutorialnya tidak terlalu mengatakan karena mengasumsikan proyek Web API. Saya telah menambahkan pengontrol API, tetapi tidak dialihkan ke.
aknuds1
1
Tutorial itu tidak banyak membantu dalam menambahkan API Web ke proyek yang sudah ada, jadi saya mencari tahu dari proyek API Web, seperti yang dijabarkan dalam jawaban saya.
aknuds1
Saya setuju, sepertinya pipa ledeng ini sudah terpasang jika Anda menggunakan templat proyek Aplikasi Web.
longda
@cuongle: web api versi 2.2 akan diinstal dengan mvc 4? apakah itu mendukung MVC 4?
Thomas
20

Sebelum Anda mulai menggabungkan proyek MVC dan API Web, saya sarankan untuk membaca tentang kontra dan pro untuk memisahkan ini sebagai proyek yang berbeda. Satu hal yang sangat penting (milik saya) adalah sistem otentikasi, yang sama sekali berbeda.

JIKA Anda perlu menggunakan permintaan terotentikasi pada MVC dan Web API, Anda harus ingat bahwa Web API TETAP (tidak perlu menjaga sesi, permintaan HTTP sederhana, dll.), Tetapi MVC tidak.

Untuk melihat perbedaan implementasi cukup buat 2 proyek berbeda di Visual Studio 2013 dari Templat: satu untuk MVC dan satu untuk Web API (jangan lupa nyalakan "Otentikasi Individu" selama pembuatan). Anda akan melihat banyak perbedaan di AuthencationControllers.

Jadi, waspadalah.

Yarkov Anton
sumber
11

CATATAN: ini hanyalah singkatan dari jawaban ini di atas

  1. Buka konsol pengelola Paket NuGet dan jalankan

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Tambahkan referensi System.Web.Routing, System.Web.Netdan System.Net.Httpdll jika belum ada di sana

  3. Tambahkan kelas berikut

    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. Tambahkan Application_Startmetode jika belum ada di sana (dalam file global.asax.cs)

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  5. Klik kanan folder pengontrol> tambahkan item baru> web> Tambahkan pengontrol 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";
            }  
        }
    }
Hakan Fikst
sumber
Di mana tepatnya kita menambahkan referensi ke System.Web.Routing, System.Web.Net dan System.Net.Http?
gabed123
1
Dari Dialog Tambah Referensi, buka dialog itu dan cari nama-nama majelis itu, ada kemungkinan besar bahwa mereka sudah ditambahkan. (tapi hanya untuk memastikan)
Hakan Fıstık
Apakah metode Application_Start seharusnya menjadi bagian dari kelas global di Global.asax.cs?
gabed123
ya, saya memperbarui jawaban saya untuk menunjukkan bahwa, bahwa Anda untuk catatan
Hakan Fıstık
1
@HakamFostok Ini membantu saya. Terima kasih!
csichar
3

Solusi di atas berfungsi dengan baik. Saya lebih suka memilih opsi Web API sambil memilih templat proyek seperti yang ditunjukkan pada gambar di bawah ini

Catatan: Solusinya bekerja dengan Visual Studio 2013 atau lebih tinggi. Pertanyaan asli ditanyakan pada 2012 dan ini adalah 2016, oleh karena itu menambahkan solusi Visual Studio 2013 atau lebih tinggi.

Template proyek menampilkan opsi API web

Sankar Krishnamoorthy
sumber
2
Jika Anda membuat proyek yang melibatkan Web API, akan lebih mudah untuk memilih opsi Web API. Opsi ini akan membuat semua file yang diperlukan seperti yang disebutkan dalam balasan di atas.
Sankar Krishnamoorthy
Masalah yang ada di sini adalah di Visual studio 2012 dan MVC 4. Meskipun solusi Anda baik-baik saja, Anda tidak dapat melakukannya dengan cara seperti itu di VS 2012
netfed
Ini adalah poin yang bagus dan saya telah mencoba solusi di atas dengan VS 2013. Terima kasih @netfed untuk menunjukkan.
Sankar Krishnamoorthy
Hai Semua, saya punya elemen API yang berfungsi dalam solusi MVC saya, tetapi sebagai default mencoba untuk menjalankan solusi sebagai solusi API. Tapi saya ingin itu berjalan sebagai solusi MVC sebagai default dan kemudian jika Anda pergi ke lokasi API dll, jalankan API .. Apakah ada orang lain yang memiliki masalah ini dan dapat menyelesaikannya? Terima kasih
Chris Cooper
1

Saya memiliki masalah yang sama, solusinya sangat mudah

Klik kanan pada solotion, instal Microsoft.ASP.NET.WebApi dari "Manage Nuget Package for Sulotion"

booming itu saja;)

iDeveloper
sumber