Webapi路由添加namespace支持及Swagger的优化

  webapi开发中通常会使用Swagger UI来生成接口文档,关于Swagger的安装与集成已经有大量博客进行了记录,这里不再赘述。随着业务扩展,接口越来越多,使用了一段时间Swagger以后,感觉基本功能不太满足业务要求,于是研究了一番webapi和Swagger。
  webapi的默认路由模板最多支持:api/{controller}/{action}/{id},但我们想要在路由中加入命名空间,以此对接口进行业务划分,比如这样的:api/{namespace}/{action}/{id}。当接口较多时,文档一页会展示大量接口,眼睛都看花了,而且其中很多接口是早期项目中用到的,不需要频繁查看,这就需要用到swagger文档多版本管理功能。我查看了很多关于这两方面的博客,借鉴了部分前人的经验。由于部分博客存在随意复制粘贴的问题,内容不全且部分实现未经验证,花了我不少功夫。这里还是要感谢一下这些提供思路的博主。
  在进行改造整合的时候,我发现swagger对改造后的路由不太兼容,而且版本控制大多都是以路由来控制的,不能实现我想达到的效果。下面将逐一介绍路由和文档的改造。

webapi路由模板改造

  思路是自己实现一个IHttpControllerSelector,在路由中嵌入命名空间,这里参考了不是豆豆的博客。实现之后接口的请求路径就变成了api/{namespace}/{action}/{id},已经满足了使用需求,但swagger的支持效果不够好。不用swagger的小伙伴可以到此为止。为了让swagger显示的url更加美观,我稍作了修改,将路由模板的命名空间由namespace.controller的格式换成了namespace/controller的格式。实现之后,swagger的效果变成了这样:

直接修改路由模板的效果.png

  显然,这太不美观了,不仅每个控制器的名字都带上了controller,而且因为webapi对属性路由的支持,路由模板中的{namespace}被swagger当作了参数:

namespace被识别为参数.png

  于是开始对swagger进行改造。

- 阅读剩余部分 -

.net项目中配置log4net

  log4net是常用的日志工具,个人在.net项目中也经常使用,下面介绍在web项目和windows服务项目中分别配置log4net的过程。

一、web项目

1.在项目中安装log4net程序包

  在vs的解决方案管理器中选择需要添加log4net的项目,右击,然后在弹出菜单中点击“管理NuGet程序包”。

  接着在打开的NuGet包管理器中选择“浏览”标签页,在搜索框中输入log4net搜索。在搜索结果中选择Apache经典红色羽毛图标的包,然后安装。

2.添加log4net配置文件

  两种方案选择一种:

  方案1.早期的log4net包安装后会自动生成log4net.config配置文件,目前新版的程序包安装后不会自动生成配置文件了,所以就直接在web.config文件中添加log4net配置信息。打开项目的web.config文件,找到节点,在该节点下添加配置信息,具体xml代码如下:

<!--log4net日志配置信息,较为简单,需要更丰富和强大的功能可以去查找更详细的资料-->
  <log4net>   
    <root>
      <level value="ALL" />
      <appender-ref ref="SysAppender" />
    </root>
    <logger name="WebLogger">
      <level value="DEBUG" />
    </logger>
    <appender name="SysAppender" type="log4net.Appender.RollingFileAppender,log4net">
    <!--日志输出的路径:D:\Log\,根据需要替换为实际的路径-->
      <param name="File" value="D:\Log\" />
      <!--是否向日志文件中追加文本,日志一般一天一份,当天的日志都是追加到同一份文件中-->
      <param name="AppendToFile" value="true" />
      <!--创建新文件的方式,可选为Size(按文件大小),Date(按日期),Once(每启动一次创建一个文件),Composite(按日期及文件大小),默认为Composite-->
      <param name="RollingStyle" value="Date" />
      <!--文件名格式:Logs_年月日.txt,会根据日期自动变更-->
      <param name="DatePattern" value="&quot;Logs_&quot;yyyyMMdd&quot;.txt&quot;" />
      <!--文件名是否动态生成,上面已经指定了格式,这里设为false-->
      <param name="StaticLogFileName" value="false" />
       <!--每条日志具体内容的格式-->
      <layout type="log4net.Layout.PatternLayout,log4net">
      <!--此处指定的格式为:时间(年月日时分秒毫秒) [线程id] 日志级别 当前日志对象名称 - 程序中输出的日志信息 换行-->
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
      </layout>
    </appender>
  </log4net>

  方案2.也可以选择新建一个log4net.config文件,在该文件下添加配置内容,记得在上面给出的代码外层加上节点

- 阅读剩余部分 -

Git简易使用手册--基础

meitu.jpg

git学习笔记

使用git bash来进行版本控制操作

1.初始化代码仓库:进入作为仓库的文件夹,使用git init 来初始仓库

$ git init

2.向仓库添加内容:

将当前修改的内容添加到暂存区:git add

将暂存区中的内容提交到仓库:git commit

$ git add
$ git commit -m '提交注释'

也可以指定添加某个单独文件,将文件名接在命令后,例:

$ git add helloworld.txt
$ git commit helloworld.txt

3.查看操作的历史记录:git log

$ git log

查看命令历史记录:git reflog

$ git reflog

4.在Git中,用==HEAD==表示当前版本,也就是最新的提交的版本,上一个版本就是HEAD^ ,上上一个版本就是HEAD^^ ,如果再往前追溯的话,为了避免写一长串^,可以写成HEAD~number,number就是追溯的版本数。

$ git reset --hard HEAD^


5.回到某个版本(在知道commit id的情况下):git reset --hard commit_id

$ git reset --hard commit_id

6.撤销修改:git checkout -- file,就是让这个文件回到最近一次git commit或git add时的状态。

$ git checkout -- file

7.从版本库中删除文件: git rm file,删除也是改动操作,也需要git commit到版本库中。

$ git rm file

- 阅读剩余部分 -

Python学习笔记(二)

python.jpg

二、python语言基本数据类型

1.python基本数据类型:整数、浮点数、字符串、布尔值(True、False)、空值(None)

2.变量:变量名必须是大小写英文、数字和下划线(_)的组合,且不能用数字开头,python作为动态语言,变量不需要声明,但使用时必须赋值,变量类型根据赋值类型来决定,也因为不需要声明,所以对于python变量数据类型的检查尤为重要;

3.注释:#后接需要注释的内容;

4.字符串:用''或者""将内容括起来以表示字符串,字符串中出现’,则将字符串用”括起来,若字符串中出现“,则将其用‘括起来,同时出现'和"时,使用\来转义,转义字符不包含在字符串内容中;

5.row字符串:在字符串前使用r,即r’...‘来表示row字符串,row字符串内不需要转义,但是r'...'表示法不能表示多行字符串,也不能表示包含'和 "的字符串;

6.多行字符串:用 括起来的字符串表示多行字符串,可以直接回车跨越多行;

7.Unicode字符串:在字符串前加u表示Unicode编码的字符串,Python的Unicode字符串支持"中文","日文","韩文"等多种语言';

8.编码格式声明:
1.# -*- coding: 编码格式 -*-
2.# coding=编码格式
3.# -*- coding=编码格式 -*-,第一种为Emacs推荐的写法;

9.布尔类型值:Python把0、空字符串''和None看成 False,其他数值和非空字符串都看成 True;

10.print语句:向屏幕输出制定内容,可以是字符也可以是数字,使用逗号,连接多个输出内容时,python会自动将逗号变成空格输出;

Python学习笔记(一)

python.jpg

  Python是动态语言,和平常学过的C,Java等有着很多不同的地方,虽然基本语法有很相似,但有一些容易弄混的地方还是要记录下来,回头复习的时候方便一点。

一、开发环境及入门知识

1.开发环境搭建

下载地址:https://www.python.org/downloads/
Windows下安装:去python官网选择需要的windows版本进行下载,然后在windows电脑上点击安装包来完成安装,然后在环境变量Path后追加上python的安装目录即可;

linux下安装:linux系统自带python,可以直接使用,如果需要更新,则可以参照这篇博客;http://www.cnblogs.com/lanxuezaipiao/archive/2012/10/21/2732864.html

开发工具:Eclipse + PyDev、PyCharm、Vim

2.python编译过程

.py文件-->由python解释器转换-->字节码文件(.pyc和.pyo)-->由python解释器转换-->二级制文件-->内存中运行-->结果;

3.使用python命令

python -m py_compile xxx.py 将.py文件编译成.pyc文件-->xxx.pyc;
python -o -m py_compile xxx.py 将.py文件编译成.pyo文件-->xxx.pyo;
.pyc和.pyo文件都可以直接用python命令来运行得到结果,但.pyo是.pyc经过解释器优化过的,运行这两者都比直接运行.py文件要高效;