NuGet引用Microsoft.AspNet.WebApi.Corehtml
WebApiConfig.cs中配置:node
// Web API 配置和服務
config.EnableCors(new EnableCorsAttribute("*", "*", "*"));2
Global.asax中配置:ajax
GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
NuGet引用Oracle.ManagedDataAccessjson
一、根據插件生成App.config中的配置添加到Web.config中api
二、引用Oracle.ManagedDataAccess.Client跨域
一、NuGet引用log4net服務器
二、AssemblyInfo.cs中配置:架構
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4Net.config", Watch = true)]
三、新建Log4Net.config配置文件app
屬性-複製到輸出目錄改成若是較新則複製async
Log4Net.config中配置:
<!-- Level的級別,由高到低 -->
<!-- None > Fatal > ERROR > WARN > DEBUG > INFO > ALL-->
<log4net>
<!--信息日誌類-->
<logger name="loginfo">
<level value="INFO" />
<appender-ref ref="InfoAppender" />
</logger>
<!--錯誤日誌類-->
<logger name="logerror">
<level value="ERROR" />
<appender-ref ref="ErrorAppender" />
</logger>
<!--信息日誌附加介質-->
<!-- name屬性指定其名稱,type則是log4net.Appender命名空間的一個類的名稱-->
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<!--日誌輸出到exe程序這個相對目錄下-->
<param name="File" value="Log4Net\\LogInfo\\" />
<!--輸出的日誌不會覆蓋之前的信息-->
<param name="AppendToFile" value="true" />
<!--日誌文件的最大大小-->
<param name="MaximumFileSize" value="2MB" />
<!--備份文件的個數-->
<param name="MaxSizeRollBackups" value="10" />
<!--是否使用靜態文件名-->
<param name="StaticLogFileName" value="false" />
<!--日誌文件名-->
<param name="DatePattern" value="yyyyMMdd".txt"" />
<!--文件建立的方式-->
<param name="RollingStyle" value="Composite" />
<!--過濾器-->
<lockingMode type="Asia.Mobile.ApiService.Filter.MinimalLockDeleteEmpty"></lockingMode>
<!--信息日誌佈局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="日誌時間:%d [%t] <BR>%n日誌級別:%-5p <BR>%n日 志 類:%c [%x] <BR>%n%m <BR>%n 
" />
</layout>
</appender>
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log4Net\\LogError\\" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaxFileSize" value="10240" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyyMMdd".txt"" />
<param name="RollingStyle" value="Date" />
<lockingMode type="Asia.Mobile.ApiService.Filter.MinimalLockDeleteEmpty"></lockingMode>
<!--錯誤日誌佈局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="<HR COLOR=red>%n異常時間:%d [%t] <BR>%n異常級別:%-5p 
 <BR>%n異 常 類:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" />
</layout>
</appender>
</log4net>
四、新增Log4NetHelper.cs幫助類
public class Log4NetHelper { public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo"); public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror"); public static void WriteLog(string info) { if (loginfo.IsInfoEnabled) { loginfo.Info(info); } } public static void WriteLog(string info, Exception ex) { if (logerror.IsErrorEnabled) { logerror.Error(info, ex); } } }
五、新建logFilter.cs過濾器
在控制器上添加:[ApiLogFilterAttribute]
一、NuGet引用Swashbuckle
二、新增實現了ISwaggerProvider的接口類:
在App_Start文件夾中添加SwaggerControllerDescProvider.cs
/// <summary>
/// 顯示swagger控制器的描述 /// </summary>
public class SwaggerControllerDescProvider : ISwaggerProvider { private readonly ISwaggerProvider _swaggerProvider; private static ConcurrentDictionary<string, SwaggerDocument> _cache = new ConcurrentDictionary<string, SwaggerDocument>(); private readonly string _xml; /// <summary>
///
/// </summary>
/// <param name="swaggerProvider"></param>
/// <param name="xml">xml文檔路徑</param>
public SwaggerControllerDescProvider(ISwaggerProvider swaggerProvider, string xml) { _swaggerProvider = swaggerProvider; _xml = xml; } public SwaggerDocument GetSwagger(string rootUrl, string apiVersion) { var cacheKey = string.Format("{0}_{1}", rootUrl, apiVersion); SwaggerDocument srcDoc = null; //只讀取一次
if (!_cache.TryGetValue(cacheKey, out srcDoc)) { srcDoc = _swaggerProvider.GetSwagger(rootUrl, apiVersion); srcDoc.vendorExtensions = new Dictionary<string, object> { { "ControllerDesc", GetControllerDesc() } }; _cache.TryAdd(cacheKey, srcDoc); } return srcDoc; } /// <summary>
/// 從API文檔中讀取控制器描述 /// </summary>
/// <returns>全部控制器描述</returns>
public ConcurrentDictionary<string, string> GetControllerDesc() { string xmlpath = _xml; ConcurrentDictionary<string, string> controllerDescDict = new ConcurrentDictionary<string, string>(); if (File.Exists(xmlpath)) { XmlDocument xmldoc = new XmlDocument(); xmldoc.Load(xmlpath); string type = string.Empty, path = string.Empty, controllerName = string.Empty; string[] arrPath; int length = -1, cCount = "Controller".Length; XmlNode summaryNode = null; foreach (XmlNode node in xmldoc.SelectNodes("//member")) { type = node.Attributes["name"].Value; if (type.StartsWith("T:")) { //控制器
arrPath = type.Split('.'); length = arrPath.Length; controllerName = arrPath[length - 1]; if (controllerName.EndsWith("Controller")) { //獲取控制器註釋
summaryNode = node.SelectSingleNode("summary"); string key = controllerName.Remove(controllerName.Length - cCount, cCount); if (summaryNode != null && !string.IsNullOrEmpty(summaryNode.InnerText) && !controllerDescDict.ContainsKey(key)) { controllerDescDict.TryAdd(key, summaryNode.InnerText.Trim()); } } } } } return controllerDescDict; } }
三、新增SwaggerConfig.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 () { $.ajax({ type: "get", async: true, url: $("#input_baseUrl").val(), dataType: "json", success: function (data) { var summaryDict = data.ControllerDesc; var id, controllerName, strSummary; $("#resources_container .resource").each(function (i, item) { id = $(item).attr("id"); if (id) { controllerName = id.substring(9); strSummary = summaryDict[controllerName]; if (strSummary) { $(item).children(".heading").children(".options").first().prepend('<li class="controller-summary" title="' + strSummary + '">' + strSummary + '</li>'); } } }); } }); }, _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(); });
四、配置SwaggerConfig.cs
public class SwaggerConfig { public static void Register() { var thisAssembly = typeof(SwaggerConfig).Assembly; GlobalConfiguration.Configuration .EnableSwagger(c => { c.SingleApiVersion("v1", "Asia.Mobile.ApiService"); //添加下述代碼
var xmlFile = string.Format("{0}/bin/Asia.Mobile.ApiService.XML", System.AppDomain.CurrentDomain.BaseDirectory); if (System.IO.File.Exists(xmlFile)) { c.IncludeXmlComments(xmlFile); } c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First()); c.CustomProvider((defaultProvider) => new SwaggerControllerDescProvider(defaultProvider, xmlFile)); }) .EnableSwaggerUi(c => { c.InjectJavaScript(Assembly.GetExecutingAssembly(), "Asia.Mobile.ApiService.Scripts.SwaggerConfig.js"); }); } }
五、配置項目的XML文檔文件
六、取消警告提示
六、分組
新增描述信息過濾器:
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class ControllerGroupAttribute : Attribute { /// <summary>
/// 當前Controller所屬模塊 請用中文 /// </summary>
public string GroupName { get; private set; } /// <summary>
/// 當前controller用途 請用中文 /// </summary>
public string Useage { get; private set; } /// <summary>
/// Controller描述信息 構造 /// </summary>
/// <param name="groupName">模塊名稱</param>
/// <param name="useage">當前controller用途</param>
public ControllerGroupAttribute(string groupName, string useage) { if (string.IsNullOrEmpty(groupName) || string.IsNullOrEmpty(useage)) { throw new ArgumentNullException("groupName||useage"); } GroupName = groupName; Useage = useage; } }
給Controller加上這個Attribute,再給SwaggerConfig.cs進行分組操做:
c.GroupActionsBy(apiDesc => apiDesc.GetControllerAndActionAttributes<ControllerGroupAttribute>().Any() ? apiDesc.GetControllerAndActionAttributes<ControllerGroupAttribute>().First().GroupName + "_" + apiDesc.GetControllerAndActionAttributes<ControllerGroupAttribute>().First().Useage : "無模塊歸類");