㈠ 如何改写WebApi部分默认规则
namespace Xinchen.SOA.Server
{
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
HttpConfiguration config = new HttpConfiguration();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{action}"
);
config.Services.Add(typeof(ValueProviderFactory), new MyValueProviderFactory());//自定义参数查找,实现第三个目标
config.Services.Replace(typeof(IHttpControllerSelector), new ControllerSelector(config));//自定义控制器查找,实现第一个目标
config.Services.Replace(typeof(IHttpActionSelector), new HttpActionSelector());//自定义Action查找,实现第二个目标
appBuilder.UseWebApi(config);
㈡ ASP.NET开发的管理系统是用框架好还是用母版页好
模板维护起来方便快捷,
框架用于布局
模板其实有很多限制的,有时候确实挺不好用,如果母板页里用form标签了,内容页就不可以用了。框架在后台页面用的还挺爽的
框架需要网页之间相互传递参数,模板页不用。
看情况使用吧。
如果页面间传参少的话,用框架合适;
如果经常要传许多参数并且页面间交互频繁,则可以选择母版。
母板不能解决布面局部刷新问题,对用户的体验不好,点一下连接,整个页面都要刷新.
感觉母板对开发人员来说是个好东西,对用户来说,个人觉得不如框架,特别是用母板来导航时,很烦的.
我原来用母板导航的应用现在都改成框架了.
div不能跨框架,但模板页每次都要全部重新加载,
两者各有优劣,就看你在开发过程中的需求了
框架是浏览器窗口中的一个区域,一个框架对应一个单独的HTML文档,例如,一个页面中有两个框架实际上他有三个Html文档,一个是框架集文件,另外两个是框架文件。也就是说一个框架集是由多个框架页面组成的。
模板可以创建具有相同布局的一系列文件,同时,模板最大的好处在于它的后期维护方便,可以快速的改变整个站点的布局和外观。 模板是由可编辑区域和不可编辑区域两部分组成,不可编辑区域包含所有页面中共有的部分,可编辑区域是为页面中不同部分的编辑设置的。
框架和模板都能统一页面的风格,不过框架集设计的页面是在同一个页面中操作,只是不同的框架发生了变化,模板变化的整个网页,只是它里边包含一些共同的部分,通过设计模板来统一设计。
个人认为:模板主要为了统一页面的风格。框架主要为了实现让一个窗口显示多个页面。
另外,在使用中发现使用框架集好像整个页面没有滚动条,单个框架根据内容的多少可以设置显示滚动条,但是整个窗口的内容没法滚动,不知道有没有方法实现。
㈢ ASP.NET除了做网站外,通常还可以做什么
还能做控制台应用程序,和winform,什么类型的软件。学语言先用控制台应用程序写吧,了解语言的用法就好。其它的都一样,学asp.net就是了解下控件就好了,同理winform也是
㈣ 开发一套小型且完整的数据管理系统需要哪些知识
mongodb 做数据库nodejs写服务端html + css + js 写浏览器端需要哪些知识很难说得准确,业务是一定要懂的,基本的技术如各环境的api,js语言,页面设计与重构也是必须会的,再往上说,整个系统的架构设计,底层数据结构设计,算法设计,其实不是需要哪些知识,而是,你会的就用得上,如果你会,我想大数据,机器学习都是可以用上的。
㈤ 如何改写WebApi部分默认规则
如何改写WebApi部分默认规则
如何改写WebApi部分默认规则为什么要改最近公司在推广SOA框架,第一次正经接触这种技术(之前也有但还是忽略掉吧),感觉挺好,就想自己也折腾一下,实现一个简单的SOA框架
用过mvc进行开发,印象之中WebApi和Mvc好像是一样的,带着这样的预设开始玩WebApi,然后被虐得找不到着北。
被虐的原因,是Mvc和WebApi在细节上差别还是有点大,例如:
在Mvc中,一个Controller中的所有公共方法一般情况下可以响应POST方法,而WebApi中不行在Mvc中,一个Action方法中的参数即可来自Url,也可以来自Form,而WebApi中不是这样,具体的规则好像是除非你在参数中加了[FromBody],否则这个参数永远也无法从Form中获取这是这两种技术我知道的最大的差别,其他的没发现或者说是没注意,也有可能这些差别是因为我不会用,毕竟接触WebApi时间不长。如果我有些地方说错了,请指正。
就这两个不同点,我查了很多资料,也没有办法解决,第一个还好,加个特性就行了,第二个的话好像就算加了[FromBody]也还是不行,感觉就是一堆限制。接着,既然这么多让我不爽的地方,那我就来改造它吧。
改造的目标,有以下几个:
不再限制控制器必须以Controller结尾,其实这个并不是必须,只是被限制着确实不太舒服所有方法可以响应所有的请求方法,如果存在方法名相同的方法,那么才需要特性来区分Action中的参数优先从Url中获取,再从Body中获取,从Body中获取的时候,优先假设Body中的数据是表单参数,若不是则将Body中的数据当作json或xml数据进行获取定下了目标之后,感觉微软为什么要这样设计WebApi呢,或许它有它的道理。
目标好定,做起来真是头大,一开始想参考公司的SOA框架的实现,但因为我用了OWIN技术来进行宿主,而看了公司的框架好像不是用的这个,总之就是看了半天没看懂应该从哪个地方开始,反而是越看越糊,毕竟不是完全一样的技术,所以还是自己弄吧。
OK,废话了这么多,进入正题吧。首先来一个链接,没了这个文章我就不可能改造成功:http://www.cnblogs.com/beginor/archive/2012/03/22/2411496.html
OWIN宿主其实这个网上很多,我主要是为了贴代码,不然的话下面几小节写不下去
[assembly: OwinStartup(typeof(Startup))]//这句是在IIS宿主的时候使用的,作用是.Net会查找Startup类来启动整个服务 namespace Xinchen.SOA.Server { public class Startup { public void Configuration(IAppBuilder appBuilder) { HttpConfiguration config = new HttpConfiguration(); config.Routes.MapHttPRoute( name: "DefaultApi", routeTemplate: "{controller}/{action}" ); config.Services.Add(typeof(ValueProviderFactory), new MyValueProviderFactory());//自定义参数查找,实现第三个目标 config.Services.Replace(typeof(IHttpControllerSelector), new ControllerSelector(config));//自定义控制器查找,实现第一个目标 config.Services.Replace(typeof(IHttpActionSelector), new HttpActionSelector());//自定义Action查找,实现第二个目标 appBuilder.UseWebApi(config); } } } 省略了部分不太重要的代码,Services.Add和Replace从字面就能明白是什么意思,但我没有试过是否必须要像上面那样写才行
对控制器的限制public class ControllerSelector : IHttpControllerSelector { HttpConfiguration _config; IDictionary<string, HttpControllerDescriptor> _desriptors = new Dictionary<string, HttpControllerDescriptor>(StringComparer.OrdinalIgnoreCase); public ControllerSelector(HttpConfiguration config) { _config = config; } void InitControllers() { if (_desriptors.Count <= 0) { lock (_desriptors) { if (_desriptors.Count <= 0) { var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(x => !x.GlobalAssemblyCache && !x.IsDynamic); var controllerTypes = new List<Type>(); foreach (var ass in assemblies) { controllerTypes.AddRange(ass.GetExportedTypes().Where(x => typeof(ApiController).IsAssignableFrom(x))); } var descriptors = new Dictionary<string, HttpControllerDescriptor>(); foreach (var controllerType in controllerTypes) { var descriptor = new HttpControllerDescriptor(_config, controllerType.Name, controllerType); _desriptors.Add(descriptor.ControllerName, descriptor); } } } } } public IDictionary<string, HttpControllerDescriptor> GetControllerMapping() { InitControllers(); return _desriptors; } public System.Web.Http.Controllers.HttpControllerDescriptor SelectController(System.Net.Http.HttpRequestMessage request) { InitControllers(); var routeData = request.GetRouteData(); var controllerName = Convert.ToString(routeData.Values.Get("controller")); if (string.IsNullOrWhiteSpace(controllerName)) { throw new ArgumentException(string.Format("没有在路由信息中找到controller")); } return _desriptors.Get(controllerName); } } 这个其实比较简单,测试中WebApi好像没调用GetControllerMapping方法,直接调用了SelectController方法,最后一个方法中有两个Get方法调用,Get只是把从字典获取值的TryGetValue功能给封装了一下,InitControllers方法是从当前所有的程序集中找继承了ApiController的类,找到之后缓存起来。这段代码整体比较简单。
对Action的限制public class HttpActionSelector : IHttpActionSelector { public ILookup<string, HttpActionDescriptor> GetActionMapping(HttpControllerDescriptor controllerDescriptor) { var methods = controllerDescriptor.ControllerType.GetMethods(); var result = new List<HttpActionDescriptor>(); foreach (var method in methods) { var descriptor = new ReflectedHttpActionDescriptor(controllerDescriptor, method); result.Add(descriptor); } return result.ToLookup(x => x.ActionName); } public HttpActionDescriptor SelectAction(HttpControllerContext controllerContext) { var actionDescriptor = new ReflectedHttpActionDescriptor(); var routeData = controllerContext.RouteData; object action = string.Empty; if (!routeData.Values.TryGetValue("action", out action)) { throw new HttpResponseException(controllerContext.Request.CreateErrorResponse(System.Net.HttpStatusCode.NotFound, "在路由中未找到action")); } string actionName = action.ToString().ToLower(); var methods = controllerContext.ControllerDescriptor.ControllerType.GetMethods().Where(x => x.Name.ToLower() == actionName); var count = methods.Count(); MethodInfo method = null; switch (count) { case 0: throw new HttpResponseException(controllerContext.Request.CreateErrorResponse(System.Net.HttpStatusCode.NotFound, "在控制器" + controllerContext.ControllerDescriptor.ControllerName + "中未找到名为" + actionName + "的方法")); case 1: method = methods.FirstOrDefault();
break; default: var httpMethod = controllerContext.Request.Method; var filterdMethods = methods.Where(x => { var verb = x.GetCustomAttribute<AcceptVerbsAttribute>(); if (verb == null) { throw new HttpResponseException(controllerContext.Request.CreateErrorResponse(System.Net.HttpStatusCode.NotFound, "在控制器" + controllerContext.ControllerDescriptor.ControllerName + "中找到多个名为" + actionName + "的方法,请考虑为这些方法加上AcceptVerbsAttribute特性")); } return verb.HttpMethods.Contains(httpMethod); }); if (filterdMethods.Count() > 1) { throw new HttpResponseException(controllerContext.Request.CreateErrorResponse(System.Net.HttpStatusCode.NotFound, "在控制器" + controllerContext.ControllerDescriptor.ControllerName + "中找到多个名为" + actionName + "的方法,并且这些方法的AcceptVerbsAttribute都含有" + httpMethod.ToString() + ",发生重复")); } else if (filterdMethods.Count() <= 0) { throw new HttpResponseException(controllerContext.Request.CreateErrorResponse(System.Net.HttpStatusCode.NotFound, "在控制器" + controllerContext.ControllerDescriptor.ControllerName + "中找到多个名为" + actionName + "的方法,但没有方法被配置为可以响应" + httpMethod.ToString() + "请求")); } method = filterdMethods.FirstOrDefault();
break; } return new ReflectedHttpActionDescriptor(controllerContext.ControllerDescriptor, method); } } GetActionMapping方法很简单,从控制器类型中找到所有的Action方法并返回
SelectAction方法相对复杂,其实就是第二个目标的逻辑,代码看起来比较多其实并有很难的地方。
对Action的参数的限制这一块比较难,我试了很久才成功,而且还有坑
public class ActionValueBinder : DefaultActionValueBinder { protected override HttpParameterBinding GetParameterBinding(HttpParameterDescriptor parameter) { ParameterBindingAttribute parameterBinderAttribute = parameter.ParameterBinderAttribute; if (parameterBinderAttribute == null) { parameterBindingRules = parameter.Configuratio
㈥ c# webapi Session
没使用过,
既然你的程序被设计为 webapi,或者SOA架构,你应该抛弃这种设计,让第三方库 缓存 或者 本地缓存 做为验证保存。如果是设计为分布式,你需要一个中央缓存管理这些信息,
㈦ 怎么改写WebApi部分默认规则
怎么改写WebApi部分默认规则
如何改写WebApi部分默认规则
为什么要改
最近公司在推广SOA框架,第一次正经接触这种技术(之前也有但还是忽略掉吧),感觉挺好,就想自己也折腾一下,实现一个简单的SOA框架
用过mvc进行开发,印象之中WebApi和Mvc好像是一样的,带着这样的预设开始玩WebApi,然后被虐得找不到着北。
被虐的原因,是Mvc和WebApi在细节上差别还是有点大,例如:
在Mvc中,一个Controller中的所有公共方法一般情况下可以响应POST方法,而WebApi中不行
在Mvc中,一个Action方法中的参数即可来自Url,也可以来自Form,而WebApi中不是这样,具体的规则好像是除非你在参数中加了[FromBody],否则这个参数永远也无法从Form中获取
这是这两种技术我知道的最大的差别,其他的没发现或者说是没注意,也有可能这些差别是因为我不会用,毕竟接触WebApi时间不长。如果我有些地方说错了,请指正。
就这两个不同点,我查了很多资料,也没有办法解决,第一个还好,加个特性就行了,第二个的话好像就算加了[FromBody]也还是不行,感觉就是一堆限制。接着,既然这么多让我不爽的地方,那我就来改造它吧。
改造的目标,有以下几个:
不再限制控制器必须以Controller结尾,其实这个并不是必须,只是被限制着确实不太舒服
所有方法可以响应所有的请求方法,如果存在方法名相同的方法,那么才需要特性来区分
Action中的参数优先从Url中获取,再从Body中获取,从Body中获取的时候,优先假设Body中的数据是表单参数,若不是则将Body中的数据当作json或xml数据进行获取
定下了目标之后,感觉微软为什么要这样设计WebApi呢,或许它有它的道理。
目标好定,做起来真是头大,一开始想参考公司的SOA框架的实现,但因为我用了OWIN技术来进行宿主,而看了公司的框架好像不是用的这个,总之就是看了半天没看懂应该从哪个地方开始,反而是越看越糊,毕竟不是完全一样的技术,所以还是自己弄吧。