电影管理网站-第二章 API项目搭建

news/2024/5/10 1:38:50/文章来源:https://ohyewang.blog.csdn.net/article/details/79188080

自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;}/// <summary>/// 获取电影/// </summary>/// <returns></returns>public List<FM_ProductDTO> 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
{/// <summary>/// 监控日志对象/// </summary>public class WebApiMonitorLog{public string ControllerName{get;set;}public string ActionName{get;set;}public DateTime ExecuteStartTime{get;set;}public DateTime ExecuteEndTime{get;set;}/// <summary>/// 请求的Action 参数/// </summary>public Dictionary<string, object> ActionParams{get;set;}/// <summary>/// Http请求头/// </summary>public string HttpRequestHeaders{get;set;}/// <summary>/// 请求方式/// </summary>public string HttpMethod{get;set;}/// <summary>/// 请求的IP地址/// </summary>public string IP{get { return GetIP(); }}/// <summary>/// 获取监控指标日志/// </summary>/// <param name="mtype"></param>/// <returns></returns>public string GetLoginfo(){string Msg = @"Action执行时间监控:ControllerName:{0}ControllerActionName:{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);}/// <summary>/// 获取Action 参数/// </summary>/// <param name="Collections"></param>/// <returns></returns>public string GetCollections(Dictionary<string, object> 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;}/// <summary>/// 获取IP/// </summary>/// <returns></returns>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<OAUser>(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<EntityManager>().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<OhyeFilmDbContext>().InstancePerRequest();builder.RegisterType<UnitOfWork>().As<IUnitOfWork>();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<EntityManager>().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<OhyeFilmDbContext>().InstancePerRequest();builder.RegisterType<UnitOfWork>().As<IUnitOfWork>();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

 

<?xml version="1.0" encoding="utf-8" ?>
<!-- See http://github.com/faniereynders/webapiproxy for documentation on using this configuration file  --><proxy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"name="MyWebApiProxy"xsi:noNamespaceSchemaLocation="http://webapiproxy.github.io/schemas/client-config.xsd"namespace="WebApi.Proxies"generateAsyncReturnTypes="true"endpoint="http://localhost:801/api/proxies"
/>

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();}}
}


运行效果:

第四步

查看调用日志:


欢迎注册或登录查看效果: 点击打开链接

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_767624.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信网站应用开发的详细流程和引导

微信作为强大的通讯工具和社交平台&#xff0c;已经成了手机必不可少的应用&#xff0c;因此很多网站选择把微信登录网站的功能&#xff0c;方便微信用户注册登录和使用网站&#xff0c;也就是所谓的微信扫码登录应用网站。&#xff08;特别提示&#xff0c;网站应用适用于网站…

我的世界服务器广告网站,友情广告:来《我的世界》中国版一起创造世界!

原标题&#xff1a;友情广告&#xff1a;来《我的世界》中国版一起创造世界&#xff01;我是陆大明&#xff0c;今天接了条友情广告。是我们网易另一款游戏&#xff1a;《我的世界》中国版&#xff01;目前已经正式开启PCJava版不限号测试了。对于这款风靡全球的沙盒游戏&#…

半小时搭建电子商务网站--opencart

原文链接: http://codeshold.me/2017/01/opencart_installation.html 前言 朋友在亚马逊&#xff08;美国&#xff09;上开了一家网点且注册了自己的品牌&#xff0c;amazon需要品牌商提供自己的网站&#xff0c;于是乎朋友找到了我&#xff0c;并给了我一个品牌商网站的参考…

亿级流量电商详情页系统实战-2.大型电商网站的异步多级缓存构建+nginx数据本地化动态渲染的架构

1.架构图 大型电商网站的详情页架构一般是这样的核心思路&#xff0c;如下图&#xff1a; 2.两个关键点 缓存数据生产服务 缓存数据生产服务&#xff0c;一般会监听一个MQ。当有服务&#xff08;如商品服务&#xff09;数据发生变更&#xff0c;会发消息给MQ&#xff0c;此…

php自动上传图片,PHP实现网站上传图片自动加水印_php

以下为引用的内容&#xff1a;/*****************************************************参数说明:$max_file_size : 上传文件大小限制, 单位BYTE$destination_folder : 上传文件路径$watermark : 是否附加水印(1为加水印,其他为不加水印);使用说明:1. 将php.INI文件里面的"…

linux 搜索深度搜,打造国内最大知识搜索网站 解析深度搜搜索优势

近来&#xff0c;一个新型的知识搜索引擎深度搜(www.shendusou.com)引起了很多互联网用户的关注&#xff0c;原因在于其搜索内容的专业性和精准性能很好的满足各类搜索用户的不同需求。接下来&#xff0c;让我们以奶粉作为关键词一起看看深度搜的优势究竟在那里。一、不同板块分…

jav简单的个人博客网站代码_「免费」简单几步搭建个人博客网站!你确定不看看?...

序言个人博客相比大家都很熟悉&#xff0c;特别是做技术&#xff0c;搞研究的等等&#xff0c;各行各业的人都有各行各业不同风格不同用途的博客网站&#xff0c;在网站上面分享自己想分享的内容供其它人随时查看&#xff0c;但是现在各大云服务平台的建站需求都是收费的&#…

html5响应时效果,HTML5响应式网站给我们的生活带来哪些改变

原标题&#xff1a;HTML5响应式网站给我们的生活带来哪些改变正如我们所看到的一样&#xff0c;HTML5大潮正来势汹汹。互联互通的大时代下每个人都要参与其中。下面&#xff0c;蓝鸥带您看懂HTML5网站有哪些不同&#xff0c;又会给我们的生活带来哪些改变?HTML5响应式网站是HT…

织梦网站如何发布在ecs服务器上,ecs云服务器部署织梦网站

ecs云服务器部署织梦网站 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。华为云帮助中心&#xff0c;为用户提供产品简介、价格说明…

go分析和kegg分析_利用g:profiler基因注释网站进行GO注释分析

由于本人个人的一些原因&#xff0c;距离上次更新文章已经有很长时间了。在此向大家说一声抱歉。之前有关GO注释的文章里&#xff0c;有读者咨询&#xff0c;是否有批量查找基因GO注释的方法。本期&#xff0c;本人就给读者推荐一个非常实用的&#xff0c;完成基因GO批量注释的…

linux设置网站的错误页面,Linux宝塔面板怎么给网站单独设置404页面

许多网站管理员都使用宝塔面板&#xff0c;因为它易于使用且快速。 Ourboke联盟在使用过程中发现&#xff0c;在Linux系统下安装的宝塔面板网站的自定义404错误页面在上传后仍显示默认的404页面。Linux宝塔面板怎么给网站单独设置404页面如果云服务器放置多个网站&#xff0c;它…

SEO需要优化的HTML代码,SEO人员必须要懂html代码

原标题&#xff1a;SEO人员必须要懂html代码之前很多次听到有人说SEO的入行门槛很低&#xff0c;什么人都可以做&#xff0c;不需要什么基础。在本人看来&#xff0c;做SEO是需要有一定的html代码基础的&#xff0c;这是必备的。SEO涉及的方方面面有很多&#xff0c;范围很广&a…

一个漂亮的暗系色调网站主页,外表美观。

最近尝试了一下一个网站主页设计&#xff0c;主要部分都完成了 外表还算美观&#xff0c;简单容易上手。 废话不多说&#xff0c;先上效果图&#xff1a;首先初期布局大致是这样&#xff1a; 一个头部加一个尾部加主体内容&#xff08;颜色为了方便大家辨认设置的&#xff09;在…

Nginx网站服务与虚拟Web主机(域名、IP、端口)

文章目录一、Nginx概述1.什么是Lginx2.Nginx工作原理3.Nginx 的模块从功能上分为如下三类4.Nginx的模块从结构上分为核心模块、基础模块和第三方模块二、搭建Nginx虚拟Web主机1.搭建Nginx服务2.管理Nginx服务3.配置nginx的验证功能三、配置虚拟主机功能1.基于域名2.基于IP3.基于…

网站如何提速?让网站秒开

配置小鸟云服务器&#xff0c;如果选择的带宽比较小&#xff0c;比如1M&#xff0c;而网站页面很大&#xff0c;在打开网站时速度比较慢&#xff0c;怎么办&#xff1f; 在这里主要说一种提速方法&#xff1a; 1&#xff1a;升级带宽&#xff08;推荐&#xff09;&#xff0c…

服务器常见问题|新手建站云服务器到底该如何选购?

云服务器其实相当于一个服务器主机&#xff0c;其配置和物理结构远优与普通家用主机。云服务器有独立的IP&#xff0c;独立的操作系统&#xff0c;内存&#xff0c;带宽等&#xff0c;在功能与使用方法上也与服务器一模一样。你可以简单理解为&#xff0c;通过虚拟化技术实现的…

为什么建站必备云虚拟主机?

2021年第一季度&#xff0c;云基础设置服务支出增长35%&#xff0c;达到418亿美元&#xff0c;各行各业“上云”已经不算新鲜事&#xff0c;在云服务市场加速回暖的今天&#xff0c;不管是企业还是个人&#xff0c;都会选择云基础设施加快上云的步伐&#xff0c;建立属于自己的…

网站提示有风险?注意做好这几点!

在互联网虚拟世界&#xff0c;安全问题随时存在。当我们访问一个网站却被提示不安全&#xff0c;页面打不开。如果网站本身没有问题&#xff0c;那么很大几率是因为浏览器检查到网站的ssl证书过期了或者存在问题&#xff0c;为了保护用户才会出现这种提示。 检查证书是否过期 …

小鸟云云服务器可以绑定多个域名搭建多个网站吗?

云服务器绑定多个域名搭建多个网站在操作过程中有一些注意事项比如&#xff1a; 1.建站首先要准备域名、服务器 如果我们的网站是在国内&#xff0c;可以找国内的域名商注册域名&#xff0c;如果涉及到跨境电商&#xff0c;可以注册一个国外域名。同时对云服务器的选择需要注…

从0开始搭建云服务器,入门使用教程,搭建个人网站(上)

前言 从刚开始自己摸索建站教程&#xff0c;到现在了解大部分的建站流程&#xff0c;自己的能力确实得到提升。如果你也像我一样&#xff0c;是利用闲暇时间学习建站的&#xff0c;而且是刚接触不久的&#xff0c;可以参考下本文。 目录 一、准备云服务器 二、远程登录服务器&a…