电影管理网站-第二章 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{    ///     /// 监控日志对象    ///     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 Dictionary
ActionParams { 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; } }}

WebApiTrackerAttribute

 

 

 

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.Re‌​ferenceLoopHandling = 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();        }    }}

运行效果:

第四步

查看调用日志:

欢迎注册或登录查看效果: 

 

 

 

上一篇:murmur hash
下一篇:红黑树演进

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月29日 13时20分47秒