Template -- NetFramework

NetFramework

版本

  • vs2017软件
  • .Net Framework 4.6.1
  • 在 NuGet 中下载
  • MySql.Data 8.0.26.0
  • SqlSugar 5.1.4.135
  • log4net 2.0.15.0
  • Swashbuckle 5.6.0

创建

  • 新建
  • 项目
  • ASP.NET Web 应用程序(.NET Framework) Visual C#

跨域

  • Web.config
<system.webServer>
    <httpProtocol>
      <customHeaders>
        <remove name="Access-Control-Allow-Origin"/>
        <remove name="Access-Control-Allow-Methods"/>
        <remove name="Access-Control-Allow-Headers"/>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="*" />
        <add name="Access-Control-Allow-Headers" value="*" />
      </customHeaders>
    </httpProtocol>
</system.webServer>
  • Global.asax.cs
protected void Application_BeginRequest()
{ 
   if (HttpContext.Current.Request.HttpMethod == "OPTIONS") // 预检请求
   { 
      HttpContext.Current.Response.End();
   }
}

配置

  • App_Start – WebApiConfig.cs
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}", // controller 控制器名称    action 方法名称
                defaults: new { id = RouteParameter.Optional }
            );

            // 将返回的xml格式去掉
            var formatters = config.Formatters.Where(formatter =>
                 formatter.SupportedMediaTypes.Where(media =>
                 media.MediaType.ToString() == "application/xml" || media.MediaType.ToString() == "text/html").Count() > 0)
                 .ToList();

            foreach (var match in formatters)
            {
                config.Formatters.Remove(match);  //移除请求头信息中的XML格式
            }

            // 返回时间格式
            var json = config.Formatters.JsonFormatter;
            json.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";

        }
    }
  • Web.config
<configuration>
  <connectionStrings>
    <!--数据库连接-->
    <add name="mysqlconn" connectionString="database=数据库名称;server=数据库地址;uid=root;pwd=1234567;" />
    <!--日志是否开启  1 开启   2 不开启-->
    <add name="logs" connectionString="1" />
  </connectionStrings>
</configuration>
  • Utils – Tools.cs
public class Tools
    {
        public static readonly string mysqlconn = ConfigurationManager.ConnectionStrings["mysqlconn"].ConnectionString;
        public static readonly string logs = ConfigurationManager.ConnectionStrings["logs"].ConnectionString;
    }

日志

  • log4net.config 与Web.config 同级
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <log4net>
    <appender name="HitLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--日志路径-->
      <param name= "File" value= "d:\\Log\\hit"/>
      <!--是否是向文件中追加日志-->
      <param name= "AppendToFile" value= "true"/>
      <!--log保留天数-->
      <param name= "MaxSizeRollBackups" value= "10"/>
      <!--日志文件名是否是固定不变的-->
      <param name= "StaticLogFileName" value= "false"/>
      <!--日志文件名格式为:2008-08-31.log-->
      <param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
      <!--日志根据日期滚动-->
      <param name= "RollingStyle" value= "Date"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %logger%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="ERROR" />
        <param name="LevelMax" value="OFF" />
      </filter>
    </appender>

    <appender name="warnLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--日志路径-->
      <param name= "File" value= "d:\\Log\\warn"/>
      <!--是否是向文件中追加日志-->
      <param name= "AppendToFile" value= "true"/>
      <!--log保留天数-->
      <param name= "MaxSizeRollBackups" value= "10"/>
      <!--日志文件名是否是固定不变的-->
      <param name= "StaticLogFileName" value= "false"/>
      <!--日志文件名格式为:2008-08-31.log-->
      <param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
      <!--日志根据日期滚动-->
      <param name= "RollingStyle" value= "Date"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %logger%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="WARN" />
        <param name="LevelMax" value="WARN" />
      </filter>
    </appender>
    <appender name="infoLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--日志路径-->
      <param name= "File" value= "d:\\Log\\info"/>
      <!--是否是向文件中追加日志-->
      <param name= "AppendToFile" value= "true"/>
      <!--log保留天数-->
      <param name= "MaxSizeRollBackups" value= "10"/>
      <!--日志文件名是否是固定不变的-->
      <param name= "StaticLogFileName" value= "false"/>
      <!--日志文件名格式为:2008-08-31.log-->
      <param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
      <!--日志根据日期滚动-->
      <param name= "RollingStyle" value= "Date"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %logger%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="INFO" />
        <param name="LevelMax" value="INFO" />
      </filter>
    </appender>
    <appender name="debugLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <!--日志路径-->
      <param name= "File" value= "d:\\Log\\debug"/>
      <!--是否是向文件中追加日志-->
      <param name= "AppendToFile" value= "true"/>
      <!--log保留天数-->
      <param name= "MaxSizeRollBackups" value= "10"/>
      <!--日志文件名是否是固定不变的-->
      <param name= "StaticLogFileName" value= "false"/>
      <!--日志文件名格式为:2008-08-31.log-->
      <param name= "DatePattern" value= "yyyy-MM-dd&quot;.log&quot;"/>
      <!--日志根据日期滚动-->
      <param name= "RollingStyle" value= "Date"/>
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %logger%newline" />
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="DEBUG" />
        <param name="LevelMax" value="DEBUG" />
      </filter>
    </appender>
    <!-- 控制台前台显示日志 -->
    <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
      <mapping>
        <level value="ERROR" />
        <foreColor value="Red, HighIntensity" />
      </mapping>
      <mapping>
        <level value="Info" />
        <foreColor value="Green" />
      </mapping>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%n%date{HH:mm:ss,fff} [%-5level] %m" />
      </layout>

      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="Info" />
        <param name="LevelMax" value="Fatal" />
      </filter>
    </appender>

    <root>
      <!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
      <level value="all" />
      <appender-ref ref="ColoredConsoleAppender"/>
      <appender-ref ref="HitLogFileAppender"/>
      <appender-ref ref="warnLogFileAppender"/>
      <appender-ref ref="infoLogFileAppender"/>
      <appender-ref ref="debugLogFileAppender"/>
    </root>
  </log4net>
</configuration>

  • Utils – Logs.cs
public class Logs
    {
        private static object objLock = new object();
        private static Logs server;
        private static ILog dal;
        public static Logs Instance
        {
            get
            {
                lock (objLock)
                {
                    if (server == null)
                    {
                        XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));
                        dal = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
                        server = new Logs();
                    }
                    return server;
                }
            }
        }

        public void WriteDebug(string s)
        {
            if (Tools.logs == "1")
            {
                dal.Debug(s);
            }
        }
        public void WriteWarn(string s)
        {
            if (Tools.logs == "1")
            {
                dal.Warn(s);
            }
        }
        public void WriteInfo(string s)
        {
            if (Tools.logs == "1")
            {
                dal.Info(s);
            }
        }
        public void WriteError(string s)
        {
            if (Tools.logs == "1")
            {
                dal.Error(s);
            }
        }
    }

SqlSugar

  • Utils – BaseDAL.cs
public class BaseDAL
    {
        private static object objLock = new object();
        private static BaseDAL dal;
        public static BaseDAL Instance
        {
            get
            {
                lock (objLock)
                {
                    if (dal == null)
                    {
                        dal = new BaseDAL();
                    }
                    return dal;
                }
            }
        }

        public SqlSugarClient GesmartDb()
        {
            string dbstr = Tools.mysqlconn;
            SqlSugarClient Db = new SqlSugarClient(new ConnectionConfig()
            {
                ConnectionString = dbstr,//数据库连接串
                DbType = DbType.SqlServer,
                InitKeyType = InitKeyType.Attribute,//从特性读取主键和自增列信息
                IsAutoCloseConnection = true,//开启自动释放模式

            });
            //用来打印Sql方便调式    
            Db.Aop.OnLogExecuting = (sql, pars) =>
            {
                //记录日志
                Logs.Instance.WriteWarn(sql + "\r\n" +
                Db.Utilities.SerializeObject(pars.ToDictionary(it => it.ParameterName, it => it.Value)) + "sql日志");
            };
            return Db;
        }
    }
}

统一返回

  • Models – Vo
/// <summary>
    /// 统一返回
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class Response<T>
    {
        public int code { get; set; }
        public string message { get; set; }
        public T data { get; set; }
    }

使用

  • 新建数据库,表
/*
 Navicat Premium Data Transfer

 Source Server         : 127.0.0.1
 Source Server Type    : MySQL
 Source Server Version : 50742
 Source Host           : localhost:3306
 Source Schema         : ceshi

 Target Server Type    : MySQL
 Target Server Version : 50742
 File Encoding         : 65001

 Date: 19/01/2024 10:24:49
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for ceshi
-- ----------------------------
DROP TABLE IF EXISTS `ceshi`;
CREATE TABLE `ceshi`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `status` int(10) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of ceshi
-- ----------------------------
INSERT INTO `ceshi` VALUES (1, '三生三世', 1);

SET FOREIGN_KEY_CHECKS = 1;

  • 修改连接字符串
  • Models – Ceshi.cs
public class Ceshi
    {
        public int id { get; set; }
        public string name { get; set; }
        public int status { get; set; }
    }
  • Server – DAlCeshi.cs
 public class DAlCeshi
    {

        /// <summary>
        /// 获取全部
        /// </summary>
        /// <returns></returns>
        public IEnumerable<Ceshi> GetAll()
        {
            using (SqlSugarClient db = BaseDAL.Instance.GesmartDb())
            {
                var result = db.Ado.SqlQuery<Ceshi>(@"select * from ceshi;").ToList();
                return result;
            }
        }




        /// <summary>
        /// 事务
        /// </summary>
        /// <param name="value"></param>
        //public void taskQx(Ceshi value)
        //{
        //    using (SqlSugarClient db = BaseDAL.Instance.GesmartDb())
        //    {

        //        try
        //        {
        //            db.BeginTran();


        //            var d = db.Updateable(new Ceshi() { name = value.name, status = 2 }).Where(v => v.id == value.id).ExecuteCommand();


        //            db.CommitTran();
        //            db.Dispose();

        //        }
        //        catch (Exception ex)
        //        {
        //            db.RollbackTran();
        //            db.Dispose();
        //            throw ex;
        //        }

        //    }
        //}


    }
  • Controllers – CeshiModel – 新建控制器(CeshiController)
 public class CeshiController : ApiController
    {
        private DAlCeshi dAl = new DAlCeshi();


        // [ApiAuthorize]  // 认证
        [HttpGet]
        public Response<List<Ceshi>> GetAll()
        {
            var d = new Response<List<Ceshi>>()
            {
                code = 200,
                message = "成功"
            };
            try {
                d.data = dAl.GetAll().ToList();

            } catch(Exception ex)
            {
                d.message = ex.Message;
            } 
            return d;
        }

    }
  • 运行查看

认证

  • Utils – ApiAuthorizeAttribute.cs
public class ApiAuthorizeAttribute : AuthorizeAttribute
    {
        /// <summary>
        /// 指示指定的控件是否已获得授权
        /// </summary>
        /// <param name="actionContext"></param>
        /// <returns></returns>
        protected override bool IsAuthorized(HttpActionContext actionContext)
        {
            bool fis = actionContext.Request.Method == HttpMethod.Options;
            Logs.Instance.WriteError("方法:::::::::" + actionContext.Request.Method + fis);
            if (fis)
            {
                return true;
            }


            //var authHeader = from t in actionContext.Request.Headers where t.Key == "Authorization" select t.Value.FirstOrDefault();
            //if (authHeader != null)
            //{
            //    string token = authHeader.FirstOrDefault();
            //    if (!string.IsNullOrEmpty(token))
            //    {
            //        try
            //        {
            //            if (true)
            //            {
            //                actionContext.RequestContext.RouteData.Values.Add("Authorization", true);
            //                return true;
            //            }
            //            return false;
            //        }
            //        catch (Exception ex)
            //        {
            //            Logs.Instance.WriteError("授权拦截:::::::::" + ex.Message);
            //            return false;
            //        }
            //    }
            //}
            return true;
        }

        /// <summary>
        /// 处理授权失败的请求
        /// </summary>
        /// <param name="actionContext"></param>
        protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
        {
            var erModel = new Response<List<string>>()
            {
                code = 999,
                message = "认证失败",
                data = new List<string>()
            };
            actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.OK, erModel, "application/json");
        }
    }

Swaager

  • 右键项目 – 属性 – 生成 – 勾选 XML文档文件
  • Web.config 同级新建 swagger-China.js
  • swagger-China.js 右键 – 属性 – 高级 – 生成操作 – 嵌入的资源
'use strict';
window.SwaggerTranslator = {
    _words: [],

    translate: function () {
        var $this = this;
        $('[data-sw-translate]').each(function () {
            $(this).html($this._tryTranslate($(this).html()));
            $(this).val($this._tryTranslate($(this).val()));
            $(this).attr('title', $this._tryTranslate($(this).attr('title')));
        });
    },

    setControllerSummary: function () {

        try {
            console.log($("#input_baseUrl").val());
            $.ajax({
                type: "get",
                async: true,
                url: $("#input_baseUrl").val(),
                dataType: "json",
                success: function (data) {

                    var summaryDict = data.ControllerDesc;
                    console.log(summaryDict);
                    var id, controllerName, strSummary;
                    $("#resources_container .resource").each(function (i, item) {
                        id = $(item).attr("id");
                        if (id) {
                            controllerName = id.substring(9);
                            try {
                                strSummary = summaryDict[controllerName];
                                if (strSummary) {
                                    $(item).children(".heading").children(".options").first().prepend('<li class="controller-summary" style="color:green;" title="' + strSummary + '">' + strSummary + '</li>');
                                }
                            } catch (e) {
                                console.log(e);
                            }
                        }
                    });
                }
            });
        } catch (e) {
            console.log(e);
        }
    },
    _tryTranslate: function (word) {
        return this._words[$.trim(word)] !== undefined ? this._words[$.trim(word)] : word;
    },

    learn: function (wordsMap) {
        this._words = wordsMap;
    }
};


/* jshint quotmark: double */
window.SwaggerTranslator.learn({
    "Warning: Deprecated": "警告:已过时",
    "Implementation Notes": "实现备注",
    "Response Class": "响应类",
    "Status": "状态",
    "Parameters": "参数",
    "Parameter": "参数",
    "Value": "值",
    "Description": "描述",
    "Parameter Type": "参数类型",
    "Data Type": "数据类型",
    "Response Messages": "响应消息",
    "HTTP Status Code": "HTTP状态码",
    "Reason": "原因",
    "Response Model": "响应模型",
    "Request URL": "请求URL",
    "Response Body": "响应体",
    "Response Code": "响应码",
    "Response Headers": "响应头",
    "Hide Response": "隐藏响应",
    "Headers": "头",
    "Try it out!": "试一下!",
    "Show/Hide": "显示/隐藏",
    "List Operations": "显示操作",
    "Expand Operations": "展开操作",
    "Raw": "原始",
    "can't parse JSON.  Raw result": "无法解析JSON. 原始结果",
    "Model Schema": "模型架构",
    "Model": "模型",
    "apply": "应用",
    "Username": "用户名",
    "Password": "密码",
    "Terms of service": "服务条款",
    "Created by": "创建者",
    "See more at": "查看更多:",
    "Contact the developer": "联系开发者",
    "api version": "api版本",
    "Response Content Type": "响应Content Type",
    "fetching resource": "正在获取资源",
    "fetching resource list": "正在获取资源列表",
    "Explore": "浏览",
    "Show Swagger Petstore Example Apis": "显示 Swagger Petstore 示例 Apis",
    "Can't read from server.  It may not have the appropriate access-control-origin settings.": "无法从服务器读取。可能没有正确设置access-control-origin。",
    "Please specify the protocol for": "请指定协议:",
    "Can't read swagger JSON from": "无法读取swagger JSON于",
    "Finished Loading Resource Information. Rendering Swagger UI": "已加载资源信息。正在渲染Swagger UI",
    "Unable to read api": "无法读取api",
    "from path": "从路径",
    "server returned": "服务器返回"
});
$(function () {
    window.SwaggerTranslator.translate();
    window.SwaggerTranslator.setControllerSummary();
});

  • App_Start – SwaggerConfig
public static void Register()
        {
            var thisAssembly = typeof(SwaggerConfig).Assembly;


			// EnableSwagger 里面
         	// c.SingleApiVersion("v1", "NetFramework"); 
         	// c.CustomProvider((defaultProvider) => new SwaggerCacheProvider(defaultProvider, string.Format(@"{0}\bin\NetFramework.XML", System.AppDomain.CurrentDomain.BaseDirectory)));
                        
            // EnableSwaggerUi 里面
            // c.InjectJavaScript(System.Reflection.Assembly.GetExecutingAssembly(), "NetFramework.swagger-China.js");
            }
            
        /// <summary>
        /// 获取接口的注释
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        protected static string GetXmlCommentsPath(string name)
        {
            return string.Format(@"{0}\bin\NetFramework.XML", AppDomain.CurrentDomain.BaseDirectory, name);
        }
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值