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.

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.


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 .


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>

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


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

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.


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

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


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.