
电影管理网站-第二章 API项目搭建
发布日期:2021-05-08 04:51:06
浏览次数:30
分类:精选文章
本文共 12198 字,大约阅读时间需要 40 分钟。
自WCF之后,现在主流的就是WebAPI,如果你还在用WCF来创建新的项目,那就看看WebAPI是否更好呢!
第一步
新建项目:Ohye.Film.API
添加控制器:FilmController
using Ohye.Film.Application.Film;using Ohye.Film.DTO.Film;using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Http;using System.Web.Http;namespace Ohye.Film.API.Controllers{ public class FilmController : ApiController { ProductService _productService; public FilmController(ProductService productService) { _productService = productService; } ////// 获取电影 /// ///public List GetProductList(string name) { int total = 0; var result = _productService.Query(1, 25, out total, false, "").ToList(); return result; } }}
添加接口调用监控:
WebApiMonitorLog
using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace Ohye.Film.API.Models{ ///WebApiTrackerAttribute/// 监控日志对象 /// public class WebApiMonitorLog { public string ControllerName { get; set; } public string ActionName { get; set; } public DateTime ExecuteStartTime { get; set; } public DateTime ExecuteEndTime { get; set; } ////// 请求的Action 参数 /// public DictionaryActionParams { get; set; } /// /// Http请求头 /// public string HttpRequestHeaders { get; set; } ////// 请求方式 /// public string HttpMethod { get; set; } ////// 请求的IP地址 /// public string IP { get { return GetIP(); } } ////// 获取监控指标日志 /// /// ///public string GetLoginfo() { string Msg = @" Action执行时间监控: ControllerName:{0}Controller ActionName:{1} 开始时间:{2} 结束时间:{3} 总 时 间:{4}秒 Action参数:{5} Http请求头:{6} 客户端IP:{7}, HttpMethod:{8} "; return string.Format(Msg, ControllerName, ActionName, ExecuteStartTime, ExecuteEndTime, (ExecuteEndTime - ExecuteStartTime).TotalSeconds, GetCollections(ActionParams), "", IP, HttpMethod); } /// /// 获取Action 参数 /// /// ///public string GetCollections(Dictionary Collections) { string Parameters = string.Empty; if (Collections == null || Collections.Count == 0) { return Parameters; } foreach (string key in Collections.Keys) { Parameters += string.Format("{0}={1}&", key, Collections[key]); } if (!string.IsNullOrWhiteSpace(Parameters) && Parameters.EndsWith("&")) { Parameters = Parameters.Substring(0, Parameters.Length - 1); } return Parameters; } /// /// 获取IP /// ///public string GetIP() { string ip = string.Empty; if (!string.IsNullOrEmpty(System.Web.HttpContext.Current.Request.ServerVariables["HTTP_VIA"])) ip = Convert.ToString(System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]); if (string.IsNullOrEmpty(ip)) ip = Convert.ToString(System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]); return ip; } }}
using Ohye.Film.Infrastructure;using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Web;using System.Web.Http.Controllers;using System.Web.Http.Filters;namespace Ohye.Film.API.Models{ [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)] public class WebApiTrackerAttribute : ActionFilterAttribute { private readonly string Key = "_thisWebApiOnActionMonitorLog_"; public override void OnActionExecuting(HttpActionContext actionContext) { base.OnActionExecuting(actionContext); WebApiMonitorLog MonLog = new WebApiMonitorLog(); MonLog.ExecuteStartTime = DateTime.Now; //获取Action 参数 MonLog.ActionParams = actionContext.ActionArguments; MonLog.HttpRequestHeaders = actionContext.Request.Headers.ToString(); MonLog.HttpMethod = actionContext.Request.Method.Method; actionContext.Request.Properties[Key] = MonLog; var form = System.Web.HttpContext.Current.Request.Form; #region 如果参数是实体对象,获取序列化后的数据 Stream stream = actionContext.Request.Content.ReadAsStreamAsync().Result; Encoding encoding = Encoding.UTF8; stream.Position = 0; string responseData = ""; using (StreamReader reader = new StreamReader(stream, encoding)) { responseData = reader.ReadToEnd().ToString(); } if (!string.IsNullOrWhiteSpace(responseData) && !MonLog.ActionParams.ContainsKey("__EntityParamsList__")) { MonLog.ActionParams["__EntityParamsList__"] = responseData; } #endregion } public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { WebApiMonitorLog MonLog = actionExecutedContext.Request.Properties[Key] as WebApiMonitorLog; MonLog.ExecuteEndTime = DateTime.Now; MonLog.ActionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName; MonLog.ControllerName = actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName; string info = MonLog.GetLoginfo(); APILogger.Info($"{ MonLog.ControllerName}.{MonLog.ActionName}", info); if (actionExecutedContext.Exception != null) { string requestMessage = string.Format(@" 请求【{0}Controller】的【{1}】产生异常: Action参数:{2} Http请求头:{3} 客户端IP:{4}, HttpMethod:{5} ", MonLog.ControllerName, MonLog.ActionName, MonLog.GetCollections(MonLog.ActionParams), MonLog.HttpRequestHeaders, MonLog.GetIP(), MonLog.HttpMethod); string errorMsg = requestMessage + "\r\n" + actionExecutedContext.Exception; APILogger.Info($"{ MonLog.ControllerName}.{MonLog.ActionName}", errorMsg); } } }}
修改路由规则:
WebApiConfig
using System;using System.Collections.Generic;using System.Linq;using System.Web.Http;namespace Ohye.Film.API{ public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API 配置和服务 // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } ); } }}配置IOC依赖注入
using Autofac;using OA.Common.DtoModel;using Ohye.Film.API.Models;using Ohye.Film.Domain;using Ohye.Film.Infrastructure;using Ohye.Film.Infrastructure.EFRepositories;using Ohye.Film.Infrastructure.EFRepositories.UnitOfWork;using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using System.Web;using System.Web.Http;using System.Web.Mvc;using System.Web.Optimization;using System.Web.Routing;using Autofac.Integration.WebApi;using Ohye.Film.Application;using Newtonsoft.Json;using Ohye.Film.Application.Film;namespace Ohye.Film.API{ public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { var configuration = GlobalConfiguration.Configuration; configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; var builder = IocCenter.ContainerBuilder; builder.Register第二步(c => CreateOAUser()).AsSelf().InstancePerRequest(); SetupResolveRules(builder); builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); var container = IocCenter.Container; var resolver = new AutofacWebApiDependencyResolver(container); configuration.DependencyResolver = resolver; AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); configuration.Filters.Add(new WebApiTrackerAttribute()); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); AutoMapperConfig.RegisterMappings(); } protected void SetupResolveRules(ContainerBuilder builder) { var application = Assembly.Load("Ohye.Film.Application"); builder.RegisterType ().AsSelf().SingleInstance(); builder.RegisterAssemblyTypes(application) .Where(t => t.Name.EndsWith("Service")) .AsSelf(); var domainServices = Assembly.Load("Ohye.Film.Domain.Services"); builder.RegisterAssemblyTypes(domainServices) .Where(t => t.Name.EndsWith("Service")) .AsSelf(); builder.RegisterType ().InstancePerRequest(); builder.RegisterType ().As (); builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)).InstancePerDependency(); } private OAUser CreateOAUser() { return new OAUser { }; } }}var resolver = new AutofacWebApiDependencyResolver(container); configuration.DependencyResolver = resolver; AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); configuration.Filters.Add(new WebApiTrackerAttribute()); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); AutoMapperConfig.RegisterMappings(); } protected void SetupResolveRules(ContainerBuilder builder) { var application = Assembly.Load("Ohye.Film.Application"); builder.RegisterType ().AsSelf().SingleInstance(); builder.RegisterAssemblyTypes(application) .Where(t => t.Name.EndsWith("Service")) .AsSelf(); var domainServices = Assembly.Load("Ohye.Film.Domain.Services"); builder.RegisterAssemblyTypes(domainServices) .Where(t => t.Name.EndsWith("Service")) .AsSelf(); builder.RegisterType ().InstancePerRequest(); builder.RegisterType ().As (); builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)).InstancePerDependency(); } private OAUser CreateOAUser() { return new OAUser { }; } }}
启动项目,浏览器中输入:http://localhost:801/Help
使用PostMan调用一下:
第三步
使用API代理调用,新建项目Ohye.Film.ApiClient
Nuget安装:WebApiProxy.CSharp
配置文件:
WebApiProxy.config
nuget程序包管理器控制台中执行以下命令: WebApiProxy-Generate-CSharp,会自动生成客户端调用的代码。
Program:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Ohye.Film.ApiClient{ class Program { static void Main(string[] args) { WebApi.Proxies.Clients.FilmClient filmClient = new WebApi.Proxies.Clients.FilmClient(); filmClient.GetProductList("").ForEach(p => { Console.WriteLine($"电影:{p.Name}"); }); Console.ReadKey(); } }}运行效果:
第四步
查看调用日志:
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月29日 13时20分47秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
android10Binder(一)servicemanager启动流程
2021-05-09
ES6基础之——new Set
2021-05-09
nodeJS实现识别验证码(tesseract-ocr+GraphicsMagick)
2021-05-09
玩玩小爬虫——试搭小架构
2021-05-09
AS与.net的交互——加载web上的xml
2021-05-09
Javascript之旅——第八站:说说instanceof踩了一个坑
2021-05-09
Javascript之旅——第九站:吐槽function
2021-05-09
Javascript之旅——第十一站:原型也不好理解?
2021-05-09
Sql Server之旅——第十站 看看DML操作对索引的影响
2021-05-09
十五天精通WCF——第二天 告别烦恼的config配置
2021-05-09
双十一来了,别让你的mongodb宕机了
2021-05-09
asp.net mvc 之旅 —— 第六站 ActionFilter的应用及源码分析
2021-05-09
Tomcat 热部署
2021-05-09
深入解析 HTTP 缓存控制
2021-05-09
深入浅出访问者模式
2021-05-09
深入探索Android热修复技术原理读书笔记 —— 热修复技术介绍
2021-05-09
百度前端技术学院task16源代码
2021-05-09
解析js中( ( ) { } ( ) )的含义
2021-05-09
js设计模式总结5
2021-05-09
Python大神编程常用4大工具,你用过几个?
2021-05-09