swagger配置以及中文化

webapi搭建

1.导nuget包

在这里插入图片描述

2.设置xml输出位置

右键项目→属性→生成→选中下方的 “XML文档文件” 然后保存
在这里插入图片描述
把红框里的路径记好,后面还会用到

3.配置App_Start下的SwaggerConfig.cs

最后的路径就是上面第二步的xml路径

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

            GlobalConfiguration.Configuration
                .EnableSwagger(c =>
                    {
                        c.SingleApiVersion("v1", "test1");
                        c.IncludeXmlComments(GetXmlCommentsPath());
                    })
                .EnableSwaggerUi(c =>
                    {

                    });
        }

        private static string GetXmlCommentsPath()
        {
            return System.String.Format(@"{0}/bin/App_Data/testSwagger.xml", System.AppDomain.CurrentDomain.BaseDirectory);
        }

4.写webapi接口
配置WebApiConfig
添加如下路由

config.Routes.MapHttpRoute(
               name: "testapi",
               routeTemplate: "api/{controller}/{action}/{id}",
               defaults: new { id = RouteParameter.Optional }
           );          

5.在controllers中添加控制器类

public class DefaultController : ApiController
    {
        //检查用户是否已经注册
        private ApiTools tool = new ApiTools();
        [HttpPost]
        public HttpResponseMessage CheckUserName(string _userName)
        {
            int num = UserInfoGetCount(_userName);//查询是否存在该用户
            if (num>0)
            {
                return tool.MsgFormat(ResponseCode.操作失败, "不可注册/已经注册", "1" + _userName);
            }
            else
            {
                return tool.MsgFormat(ResponseCode.成功, "可注册", "0 " + _userName);
            }
        }

        //
        private int UserInfoGetCount(string username)
        {
            return username == "admin" ? 1 : 0;
        }
    }
    //定义返回类
    public class ApiTools
    {
        private string msgModel = "{{\"code\":{0},\"message\":\"{1}\",\"result\":{2}}}";
        public ApiTools()
        {

        }
        public HttpResponseMessage MsgFormat(ResponseCode code,string explanation,string result)
        {
            string r = @"^(\-|\+)?\d+(\.\d+)?$";
            string json = string.Empty;
            if (Regex.IsMatch(result,r)|| result.ToLower() =="true" || result.ToLower() =="false" || result=="[]" || result.Contains('{'))
            {
                json = string.Format(msgModel, (int)code, explanation, result);
            }
            else
            {
                if (result.Contains('"'))
                {
                    json = string.Format(msgModel, (int)code, explanation, result);
                }
                else
                {
                    json = string.Format(msgModel, (int)code, explanation, "\"" + result + "\"");
                }
            }
            return new HttpResponseMessage { Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json") };
        }

    }

    //定义返回值枚举
    public enum ResponseCode
    {
        操作失败=00000,
        成功=10200,
    }

6.修改访问的起始页
在HomeController中添加重定向

 public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Title = "Home Page";

            //修改访问的起始页
            //做重定位转换
            Response.Redirect("/swagger/ui/index");
            return View();
        }
    }

7.启动项目就可以看到swagger界面了(虽然是蛮简单的,但是搭成了,还是蛮开心)
在这里插入图片描述

swagger中文化

8.swagger汉化和添加描述说明

• 添加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中添加两句话

在这里插入图片描述鉴于有同学说这个图片不是很方便,所以把代码放在这里,让某个同学看一下

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

            GlobalConfiguration.Configuration
                .EnableSwagger(c =>
                    {
                        c.SingleApiVersion("v1", "test1");
                        c.IncludeXmlComments(GetXmlCommentsPath());
                        c.CustomProvider((defaultProvider) => new SwaggerCacheProvider(defaultProvider, string.Format("{0}/App_Data/testSwagger.xml", System.AppDomain.CurrentDomain.BaseDirectory)));

                        
                    })
                .EnableSwaggerUi(c =>
                    {
                        c.InjectJavaScript(System.Reflection.Assembly.GetExecutingAssembly(), "test1.swagger.js");
                    });
        }

• 创建SwaggerCacheProvider类

  /// <summary>
	    /// swagger显示控制器的描述
	    /// </summary>
	    internal class SwaggerCacheProvider : ISwaggerProvider
	    {    	
	        private readonly ISwaggerProvider _swaggerProvider;
	        private static ConcurrentDictionary<string, SwaggerDocument> _cache = new ConcurrentDictionary<string, SwaggerDocument>();
	        private readonly string _xml;
	
	        public SwaggerCacheProvider(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;
	        }
	
	        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;
	        }
	    }

然后运行,已经成功显示汉化和提示

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荼白z

感谢老板请我喝咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值