添加路由

var config = new HttpSelfHostConfiguration("http://localhost:3333");
//config.Routes.MapHttpRoute("default", "api/{controller}/{id}", new { id = RouteParameter.Optional });
config.Routes.MapHttpRoute(name: "test-api", routeTemplate: "api/{controller}", defaults: new { controller = "Test" });

var server = new HttpSelfHostServer(config);
server.OpenAsync().Wait();

config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional });
name:"DefaultApi"→表示此路由的名称,这里只需要保证路由名称不重复就OK了。
routeTemplate: "api/{controller}/{id}"→表示路由的url规则,“api”是固定部分,主要用来标识当前请求的url是一个api服务的接口,区别MVC的路由,当然,这里并不是一定要写成“api”,如果你改成“apiserver”,那么你请求的url里面也需要写成“apiserver”;“{controller}”是控制器的占位符部分,在真实的url里面,该部分对应的是具体的控制器的名称,这个和MVC里面一致;“{id}”是参数的占位符部分,表示参数,一般这个参数都会在default里面设置可选。有了这个路由模板约束请求的url,比如:我们请求的url写成http://localhost:21528/Order,那么肯定是找不到对应的路由的,因为“api”这个参数必选。如果请求的url匹配不到对应的路由,则会向客户端返回一个404的状态码。
defaults: new { id = RouteParameter.Optional }→表示路由的默认值,比如上面的routeTemplate,{controller}和{id}部分都可以设置默认值,比如:defaults改成new { controller="Order", id = RouteParameter.Optional },那么我们请求http://localhost:21528/api这个url仍然能访问到GetAll()方法。
constraints→表示路由约束,一般是一个约束路由模板的正则表达式。比如:我们加入约束条件 constraints: new { id = @"\d+" } ,这就约束必须要匹配一到多个参数id,那么,我们在OrderController里面加入另一个方法

在非IIS平台里添加WebApi服务端接口

!NuGet: Microsoft.AspNet.WebApi.SelfHos
using System.Web.Http;
using System.Web.Http.SelfHost;

class WebApiHost
{
    public void InitController()
    {
        var config = new HttpSelfHostConfiguration("http://localhost:3333");
		//http://127.0.0.1:3333/api/Test
        config.Routes.MapHttpRoute("default", "api/{controller}/{id}", new { id = RouteParameter.Optional });
        // config.Routes.MapHttpRoute(name: "test-api", routeTemplate: "api/{controller}", defaults: new { controller = "A" });


        var server = new HttpSelfHostServer(config);
        server.OpenAsync().Wait();
        Console.WriteLine("Server is opened");

    }
}

public class TestController : ApiController
{
    [HttpGet]
    public IList<User> GetUser()
    {
        var user = new User { Id = 99, UserName = "Michael" };
        var list = new List<User>();
        list.Add(user);
        list.Add(user);
        return list;
    }

    [HttpGet]
    public User GetById(int id)
    {
        var user = new User { Id = id, UserName = "Michael" };
        return user;
    }
}

public class User
{
    public int Id { get; set; }

    public string UserName { get; set; }

    public DateTime CreateTime { get { return DateTime.Now; } }
}

app.manifest

!提升应用程序权限
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />