当前位置: 首页 > news >正文

企业内网网站/备案域名交易平台

企业内网网站,备案域名交易平台,厦门网站建设屈兴东,wap手机网站模版第一步:在webAPI中安装 Autofac.WebApi2 。 不要错误的安装Autofac.Mvc5,也不要错误的安装Autofac.WebApi,因为Autofac.WebApi是给webapi1的,否则会报错:重写成员“Autofac.Integration.WebApi.AutofacWebApiDependenc…

第一步:在webAPI中安装 Autofac.WebApi2 。

不要错误的安装Autofac.Mvc5,也不要错误的安装Autofac.WebApi,因为Autofac.WebApi是给webapi1的,否则会报错:重写成员“Autofac.Integration.WebApi.AutofacWebApiDependencyResolver.BeginScope()”时违反了继承安全

第二步:在App_Start中创建一个类 :取名AutoFacConfig

第三步:引入 using Autofac;  using Autofac.Integration.WebApi;

namespace WebApi.App_Start
{public class AutoFacConfig{public static void InitAutoFac(){//得到你的HttpConfiguration.var configuration = GlobalConfiguration.Configuration;var builder = new ContainerBuilder();//注册控制器builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();//可选:注册Autofac过滤器提供商.builder.RegisterWebApiFilterProvider(configuration);//builder.RegisterType(typeof(MyAuthenticationAttribute)).PropertiesAutowired(); //单独注册我们的MyAuthenticationAttribute过滤器var webapiAssembly = Assembly.Load("WebApi");//注册webapi项目中现实了IAuthorizationFilter接口或者实现了IActionFilter接口的非抽象过滤器类builder.RegisterAssemblyTypes(webapiAssembly).Where(r => !r.IsAbstract &&(typeof(IAuthorizationFilter).IsAssignableFrom(r)) || typeof(IActionFilter).IsAssignableFrom(r)).PropertiesAutowired();//对Repositorys这个程序集实现了IBaseRepository接口的非抽象类进行注册var repository = Assembly.Load("Repositorys");builder.RegisterAssemblyTypes(repository).Where(r => !r.IsAbstract).AsImplementedInterfaces().SingleInstance().PropertiesAutowired();IContainer container = builder.Build();//将依赖关系解析器设置为Autofac。var resolver = new AutofacWebApiDependencyResolver(container);configuration.DependencyResolver = resolver;}}
}

第四步:在Global.asax中引用执行。

namespace WebApi
{public class WebApiApplication : System.Web.HttpApplication{protected void Application_Start(){AutoFacConfig.InitAutoFac();//调用InitAutoFac()方法执行GlobalConfiguration.Configure(WebApiConfig.Register);}}
}

在过滤器中使用属性注入(特别注意过滤器的注册,过滤器对象最好不要直接new,而是去IOC容器中拿,否则不能直接在过滤器中使用属性注入)

例如:我创建了一个身份验证过滤器,如果过滤器中使用了属性依赖注入,那么注册这个过滤器的时候需要从IOC容器中去拿这个过滤器类对象的实例,不能直接new

namespace WebApi
{public class MyAuthenticationAttribute : IAuthorizationFilter//也可以直接继承AuthorizationFilterAttribute{public IAppInfosRepository app { get; set; }public bool AllowMultiple => true;public async Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation){//获得报文头中的AppKey和Sign (我们与客户端约定,在向服务端发起请求的时候,将AppKey和Sign放到请求报文头中)IEnumerable<string> appKeys;if (!actionContext.Request.Headers.TryGetValues("AppKey", out appKeys)) //从请求报文头中获取AppKey{{return new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized) { Content = new StringContent("报文头中的AppKey为空") };}}IEnumerable<string> signs;if (!actionContext.Request.Headers.TryGetValues("Sign", out signs)) //从请求报文头中获取Sign{return new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized) { Content = new StringContent("报文头中的Sign为空") };}string appKey = appKeys.First();string sign = signs.First();var appInfo = await app.GetByAppKeyAsync(appKey);//从数据库获取appinfo这条数据(获取AppKey,AppSecret信息)if (appInfo == null){return new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized) { Content = new StringContent("不存在的AppKey") };}if (appInfo.IsEnable == "true"){return new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden) { Content = new StringContent("AppKey已经被封禁") };}string requestDataStr = ""; //请求参数字符串List<KeyValuePair<string, string>> requestDataList = new List<KeyValuePair<string, string>>();//请求参数键值对if (actionContext.Request.Method == HttpMethod.Post) //如果是Post请求{//获取Post请求数据  requestDataStr = GetRequestValues(actionContext);if (requestDataStr.Length > 0){string[] requestParamsKv = requestDataStr.Split('&');foreach (var item in requestParamsKv){string[] pkv = item.Split('=');requestDataList.Add(new KeyValuePair<string, string>(pkv[0], pkv[1]));}//requestDataList就是按照key(参数的名字)进行排序的请求参数集合   requestDataList = requestDataList.OrderBy(kv => kv.Key).ToList();var segments = requestDataList.Select(kv => kv.Key + "=" + kv.Value);//拼接key=value的数组requestDataStr = string.Join("&", segments);//用&符号拼接起来}}if (actionContext.Request.Method == HttpMethod.Get) //如果是Get请求{//requestDataList就是按照key(参数的名字)进行排序的请求参数集合          requestDataList = actionContext.Request.GetQueryNameValuePairs().OrderBy(kv => kv.Key).ToList();var segments = requestDataList.Select(kv => kv.Key + "=" + kv.Value);//拼接key=value的数组requestDataStr = string.Join("&", segments);//用&符号拼接起来}//计算Sign (即:计算requestDataStr+AppSecret的md5值)string computedSign = MD5Helper.ComputeMd5(requestDataStr + appInfo.AppSecret);//用户传进来md5值和计算出来的比对一下,就知道数据是否有被篡改过if (sign.Equals(computedSign, StringComparison.CurrentCultureIgnoreCase)){return await continuation();}else{return new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized) { Content = new StringContent("sign验证失败") };}}/// <summary>/// 获取Post请求的请求参数内容/// 参考资料:https://www.cnblogs.com/hnsongbiao/p/7039666.html/// </summary>/// <param name="actionContext"></param>/// <returns></returns>public string GetRequestValues(HttpActionContext actionContext){Stream stream = actionContext.Request.Content.ReadAsStreamAsync().Result;Encoding encoding = Encoding.UTF8;/*这个StreamReader不能关闭,也不能dispose, 关了就傻逼了因为你关掉后,后面的管道  或拦截器就没办法读取了所有这里不要用usingusing (StreamReader reader = new StreamReader(stream, System.Text.Encoding.UTF8)){result = reader.ReadToEnd().ToString();}*/var reader = new StreamReader(stream, encoding);string result = reader.ReadToEnd();/*这里也要注意:   stream.Position = 0;当你读取完之后必须把stream的位置设为开始因为request和response读取完以后Position到最后一个位置,交给下一个方法处理的时候就会读不到内容了。*/stream.Position = 0;return result;}}
}

在WebApiConfig.cs类中注册这个过滤器 (统一注册过滤器)

namespace WebApi
{public static class WebApiConfig{public static void Register(HttpConfiguration config){// Web API 配置和服务// Web API 路由config.MapHttpAttributeRoutes();config.Routes.MapHttpRoute(name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional });//从Autofac的IOC容器中拿到MyAuthenticationAttribute过滤器的类对象//MyAuthenticationAttribute authorFilter = (MyAuthenticationAttribute)GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(MyAuthenticationAttribute));//config.Filters.Add(authorFilter); //注册过滤器//注意:如果想在过滤器中使用属性注入,则注册这个过滤器的时候,这个过滤器的对象必须要用IOC容器过得到            //不能直接new 例如:不能直接config.Filters.Add(new MyAuthenticationAttribute())//因为一个对象必须是由IOC容器创建出来的,IOC容器才会自动帮我们注入#region 统一注册过滤器var webapiAss = Assembly.Load("WebApi");//从webapiAss中拿到所有实现了IAuthorizationFilter接口,或者实现了IActionFilter接口的非抽象过滤器类var filters = webapiAss.GetTypes().Where(r => !r.IsAbstract && (typeof(IAuthorizationFilter).IsAssignableFrom(r) || typeof(IActionFilter).IsAssignableFrom(r)));foreach (var item in filters){//从IOC容器中拿到过滤器类对象(因为过滤器都是实现了IFilter接口的,所有这里以IFilter接口来接收)IFilter filter = (IFilter)GlobalConfiguration.Configuration.DependencyResolver.GetService(item);config.Filters.Add(filter); //注册过滤器} #endregion}}
}


http://www.jmfq.cn/news/4901635.html

相关文章:

  • 安徽电子工程学校/企业网站seo排名优化
  • 建网站的工具/河北网站建设公司排名
  • 郑州哪里有做网站/谷粉搜索谷歌搜索
  • 一个小型网站设计/软文范例
  • 淄博天一建设项目招标代理有限公司网站/百度网首页登录入口
  • 网站策划怎么样/软文范文200字
  • 湖南专业做网站公司/南宁seo收费
  • 群晖安装wordpress/seo公司服务
  • 我的世界做壁纸的网站/seo排名优化培训网站
  • 建立网站可以赚钱吗?/百度搜索热度指数
  • 广州市增城区建设局网站/seo扣费系统源码
  • 专业群建设 网站/小广告网站
  • 国外做外贸哪个网站好些/今天的新闻有哪些
  • 智慧团建网站什么时候维护好/seo免费优化网站
  • 建网站首选公司/百度导航怎么下载
  • 旅游网站管理系统论文/淄博网站优化
  • 什么是网络营销?网络营销有哪些特点?/宁波seo网络推广代理公司
  • 怎么用自己电脑做服务器发布网站吗/城市更新论坛破圈
  • vps 香港/seo怎么收费
  • 潍坊网站建设 潍坊做网站/企业网站建设需求分析
  • 四川做网站设计公司价格/青岛网站优化公司哪家好
  • 网站开发与设计多少钱一个网站/品牌线上推广方式
  • 网站建设征求意见分析报告/莱阳seo排名
  • 濮阳做网站/百度运营推广
  • 南充房产网官网/广州seo公司品牌
  • 珠宝网站模板免费下载/做了5天游戏推广被抓了
  • 网页设计鉴赏/西安网站seo技术厂家
  • 佛山网站制作维护/企业网站建设的一般要素
  • 无锡网站建设外贸/网店推广方式有哪些
  • 课程资源网站教建设现状分析/软文广告100字