简单创建.NET Core WebApi:https://www.cnblogs.com/yanbigfeg/p/9197375.html
登陆验证四种方式:https://www.cnblogs.com/zuowj/p/5123943.html
解决跨域的8种方法:https://blog.csdn.net/weixin_39939012/article/details/83822126
WebApi深入学习--特性路由:https://www.cnblogs.com/TiestoRay/p/5755454.html
本文的示例代码是基于.NET Framework下的,.NET WebApi与.NET Core WebApi的区别,个人认为主要是来自框架的不一样。可以参照官网https://docs.microsoft.com/en-us/aspnet/core/migration/webapi?view=aspnetcore-2.2#migrate-models-and-controllers后续介绍到.NET Core的时候再详细做下这两个框架的不同。
在WebApi中,方法名以Get开头,WebApi会自动默认之歌请求是Get请求,而如果你以其他名称开头而又不标注这个方法的请求方式,那么这个时候服务器虽然找到了这个方法,但是由于请求方式不确定,所以直接返回给你405---方法不被允许的错误
最后结论:所有的WebApi方法最好是加上请求的方式[HttpGet]/[HttpPost]/[HttpPut]/[HttpDelete],不要偷懒,这样既能防止类似的错误,也有利于方法的维护,被人一看就知道这个方法是什么请求
网站在启动时执行Application_Start(),给Route增加地址规则,请求进来时,会经过路由匹配找到合适的控制器。
那怎么找Action?
1、根据HttpMethod找方法---用的方法名字开头,Get就是对应的Get请求
2、如果名字不是Get开头,可以加上[HttpGet]
3、按照参数找最吻合
其实资源是这样定义的,不是一个学生,而可能是一个学校。可能是一个订单----多件商品,一次查询,订单-商品,数据之间嵌套关系很复杂。还有个特性路由,可以单独定制(config.MapHttpAttributeRoutes()、标机特性)
IOC容器+配置文件初始化
控制器也要注入--完成容器和WebApi框架融合--实现IDependencyResolver,将容器放进去--初始化
config.DependencyResolver 换成自定义的Resolver
public class IOCController : ApiController { private IUserService _UserService = null; public IOCController(IUserService userService) { this._UserService = userService; } public string Get(int id) { //IUserService service = new UserService(); //IUserService service = ContainerFactory.BuildContainer().Resolve<IUserService>(); return Newtonsoft.Json.JsonConvert.SerializeObject(this._UserService.Query(id)); } }
在WebApiConfig中加上:
// Web API 配置和服务 config.DependencyResolver = new UnityDependencyResolver(ContainerFactory.BuildContainer());
UnityDependencyResolver:
public class UnityDependencyResolver : IDependencyResolver { private IUnityContainer _UnityContainer = null; public UnityDependencyResolver(IUnityContainer container) { _UnityContainer = container; } public IDependencyScope BeginScope()//Scope { return new UnityDependencyResolver(this._UnityContainer.CreateChildContainer()); } public void Dispose() { this._UnityContainer.Dispose(); } public object GetService(Type serviceType) { try { return this._UnityContainer.Resolve(serviceType); } catch (Exception ex) { Console.WriteLine(ex.Message); return null; } } public IEnumerable<object> GetServices(Type serviceType) { try { return this._UnityContainer.ResolveAll(serviceType); } catch (Exception ex) { Console.WriteLine(ex.Message); return null; } } }
ContainerFactory:
/// <summary> /// 需要在nuget引用之后,单独引用Unity.Configuration /// 如果有AOP扩展,还需要引用Unity.Interception.Configuration /// 因为我们是用配置文件来做的配置 /// </summary> public class ContainerFactory { public static IUnityContainer BuildContainer() { //get //{ return _Container; //} } private static IUnityContainer _Container = null; static ContainerFactory() { ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); fileMap.ExeConfigFilename = Path.Combine(AppDomain.CurrentDomain.Base