在沒有iis的情況下,webApi自托管(轉自momo314)


第一步 新建一個控制台應用程序

並添加WebApi相關引用,注意,添加之后會默認幫你添加 System.Web.Http.WebHost 的引用,不過,折並沒有什么鳥用,干掉他,然后手動添加引用 System.Web.Http.SelfHost 。

新建項目並添加相關引用

第二步 假裝我們在開發一個正常的WebApi程序

嗯,現在我們需要一個Controller了:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Http;
using WebApi.SelfHosting.Demo.Models;

namespace WebApi.SelfHosting.Demo.Controllers
{
    public class ProductsController : ApiController
    {
        Product[] products = new Product[]
        {
            new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },
            new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },
            new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }
        };

        /// <summary>
        /// [/api/products]  Get a list of all products.
        /// </summary>
        /// <returns></returns>
        public IEnumerable<Product> GetAllProducts()
        {
            return products;
        }

        /// <summary>
        /// [/api/products/id]  Get a product by ID.
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public Product GetProductById(int id)
        {
            var product = products.FirstOrDefault((p) => p.Id == id);
            if (product == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            return product;
        }

        /// <summary>
        /// [/api/products/?category=category]  Get a list of products by category.
        /// </summary>
        /// <param name="category"></param>
        /// <returns></returns>
        public IEnumerable<Product> GetProductsByCategory(string category)
        {
            return products.Where(p => string.Equals(p.Category, category,
                    StringComparison.OrdinalIgnoreCase));
        }
    }
}

 

  

嗯, Product 類在這里:

namespace WebApi.SelfHosting.Demo.Models
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
        public decimal Price { get; set; }
    }
}

 

  

第三步 注冊路由

嗯。。。繼續假裝在寫一個正常的 WebApi ...

可是,人家是在Global里面注冊路由的啊,咱們這玩意沒有Global啊!沒關系,咱們有Main函數啊,都是程序入口,應該差不多,呵呵。。。

using System;
using System.Web.Http;
using System.Web.Http.SelfHost;

namespace WebApi.SelfHosting.Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            var config = new HttpSelfHostConfiguration("http://localhost:8080");

            config.Routes.MapHttpRoute(
                "API Default", 
                "api/{controller}/{id}",
                new { id = RouteParameter.Optional });

            using (HttpSelfHostServer server = new HttpSelfHostServer(config))
            {
                server.OpenAsync().Wait();
                Console.WriteLine("Server Listening at 8080...");
                Console.WriteLine("Press Enter to quit.");
                Console.ReadLine();
            }
        }
    }
}

 

注意:

  1. 基於WebHost的WebApi的路由是注冊到 HttpConfiguration 里的,但是基於SelfHost的卻是注冊到 HttpSelfHostConfiguration : 看吧,很明顯,多了個SelfHost
  2. 基於WebHost的WebApi一般使用IIS作為服務器,但是SelfHost,自托管,顧名思義,需要自己實現一個服務器,有點Nodejs的意思。

第四步 搞定,打開瀏覽器看看效果吧

新建項目並添加相關引用


補充: 有人表示編譯的時候會報下面的異常:

類型“System.Web.Http.SelfHost.HttpSelfHostConfiguration”違反了繼承安全性規則。派生類型必須與基類型的安全可訪問性匹配或者比基類型的安全可訪問性低。

搜索引擎給出的解決方法是修改 AssemblyInfo.cs 文件,手動指定程序集的透明級別。

其實並不是:多半是因為你引用的 System.Web.Http.SelfHost 程序集與你添加的WebApi版本不符造成的 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM