1. 新建.netCore WebApi 项目(选择Angular)。按照上一篇的加上Swage 文档,使http://localhost:11934/swagger/v1/swagger.json 可以访问。

2.新建 一个文件夹nswag,里面有3个文件

  1. refresh.bat   :  "..\node_modules\.bin\nswag" run
  2. service.config.nswag,注意修改地址
    1. {
    2. "runtime": "Default",
    3. "swaggerGenerator": {
    4. "fromSwagger": {
    5. "url": "http://localhost:11934/swagger/v1/swagger.json",
    6. "output": null
    7. }
    8. },
    9. "codeGenerators": {
    10. "swaggerToTypeScriptClient": {
    11. "className": "{controller}ServiceProxy",
    12. "moduleName": "",
    13. "namespace": "",
    14. "typeScriptVersion": 2.0,
    15. "template": "Angular",
    16. "promiseType": "Promise",
    17. "httpClass": "HttpClient",
    18. "useSingletonProvider": false,
    19. "injectionTokenType": "InjectionToken",
    20. "rxJsVersion": 6.0,
    21. "dateTimeType": "OffsetMomentJS",
    22. "nullValue": "Undefined",
    23. "generateClientClasses": true,
    24. "generateClientInterfaces": false,
    25. "generateOptionalParameters": false,
    26. "wrapDtoExceptions": false,
    27. "wrapResponses": false,
    28. "generateResponseClasses": true,
    29. "responseClass": "SwaggerResponse",
    30. "useTransformOptionsMethod": false,
    31. "useTransformResultMethod": false,
    32. "generateDtoTypes": true,
    33. "operationGenerationMode": "MultipleClientsFromPathSegments",
    34. "markOptionalProperties": false,
    35. "generateCloneMethod": true,
    36. "typeStyle": "Class",
    37. "extensionCode": "service.extensions.ts",
    38. "generateDefaultValues": true,
    39. "excludedTypeNames": [],
    40. "handleReferences": false,
    41. "generateConstructorInterface": true,
    42. "convertConstructorInterfaceData": false,
    43. "importRequiredTypes": true,
    44. "useGetBaseUrlMethod": false,
    45. "baseUrlTokenName": "API_BASE_URL",
    46. "queryNullValue": "",
    47. "output": "../src/shared/service-proxies/service-proxies.ts"
    48. },
    49. "swaggerToCSharpClient": {
    50. "generateClientClasses": true,
    51. "generateClientInterfaces": false,
    52. "generateDtoTypes": true,
    53. "injectHttpClient": false,
    54. "disposeHttpClient": true,
    55. "generateExceptionClasses": true,
    56. "exceptionClass": "SwaggerException",
    57. "wrapDtoExceptions": true,
    58. "useHttpClientCreationMethod": false,
    59. "httpClientType": "System.Net.Http.HttpClient",
    60. "useHttpRequestMessageCreationMethod": false,
    61. "useBaseUrl": true,
    62. "generateBaseUrlProperty": true,
    63. "generateSyncMethods": false,
    64. "exposeJsonSerializerSettings": false,
    65. "clientClassAccessModifier": "public",
    66. "typeAccessModifier": "public",
    67. "generateContractsOutput": false,
    68. "parameterDateTimeFormat": "s",
    69. "generateUpdateJsonSerializerSettingsMethod": true,
    70. "serializeTypeInformation": false,
    71. "queryNullValue": "",
    72. "className": "{controller}Client",
    73. "operationGenerationMode": "MultipleClientsFromOperationId",
    74. "generateOptionalParameters": false,
    75. "generateJsonMethods": true,
    76. "parameterArrayType": "System.Collections.Generic.IEnumerable",
    77. "parameterDictionaryType": "System.Collections.Generic.IDictionary",
    78. "responseArrayType": "System.Collections.ObjectModel.ObservableCollection",
    79. "responseDictionaryType": "System.Collections.Generic.Dictionary",
    80. "wrapResponses": false,
    81. "generateResponseClasses": true,
    82. "responseClass": "SwaggerResponse",
    83. "namespace": "MyNamespace",
    84. "requiredPropertiesMustBeDefined": true,
    85. "dateType": "System.DateTime",
    86. "dateTimeType": "System.DateTime",
    87. "timeType": "System.TimeSpan",
    88. "timeSpanType": "System.TimeSpan",
    89. "arrayType": "System.Collections.ObjectModel.ObservableCollection",
    90. "dictionaryType": "System.Collections.Generic.Dictionary",
    91. "arrayBaseType": "System.Collections.ObjectModel.ObservableCollection",
    92. "dictionaryBaseType": "System.Collections.Generic.Dictionary",
    93. "classStyle": "Inpc",
    94. "generateDefaultValues": true,
    95. "generateDataAnnotations": true,
    96. "excludedTypeNames": [],
    97. "handleReferences": false,
    98. "generateImmutableArrayProperties": false,
    99. "generateImmutableDictionaryProperties": false,
    100. "output": null
    101. },
    102. "swaggerToCSharpController": {
    103. "controllerStyle": "Partial",
    104. "useCancellationToken": false,
    105. "aspNetNamespace": "System.Web.Http",
    106. "className": "{controller}",
    107. "operationGenerationMode": "MultipleClientsFromOperationId",
    108. "additionalNamespaceUsages": [
    109. "System.Web.Http"
    110. ],
    111. "generateOptionalParameters": false,
    112. "generateJsonMethods": true,
    113. "parameterArrayType": "System.Collections.Generic.IEnumerable",
    114. "parameterDictionaryType": "System.Collections.Generic.IDictionary",
    115. "responseArrayType": "System.Collections.ObjectModel.ObservableCollection",
    116. "responseDictionaryType": "System.Collections.Generic.Dictionary",
    117. "wrapResponses": false,
    118. "generateResponseClasses": true,
    119. "responseClass": "SwaggerResponse",
    120. "namespace": "MyNamespace",
    121. "requiredPropertiesMustBeDefined": true,
    122. "dateType": "System.DateTime",
    123. "dateTimeType": "System.DateTime",
    124. "timeType": "System.TimeSpan",
    125. "timeSpanType": "System.TimeSpan",
    126. "arrayType": "System.Collections.Generic.IEnumerable",
    127. "dictionaryType": "System.Collections.Generic.Dictionary",
    128. "arrayBaseType": "System.Collections.ObjectModel.ObservableCollection",
    129. "dictionaryBaseType": "System.Collections.Generic.Dictionary",
    130. "classStyle": "Inpc",
    131. "generateDefaultValues": true,
    132. "generateDataAnnotations": true,
    133. "excludedTypeNames": [],
    134. "handleReferences": false,
    135. "generateImmutableArrayProperties": false,
    136. "generateImmutableDictionaryProperties": false,
    137. "output": null
    138. }
    139. }
    140. }
  3. service.extensions.ts :import 'rxjs/add/operator/finally';

3.在package.json 中添加  "nswag": "^11.18.6"

执行  npm install .如果安装不上,可以改变下仓库:npm set registry https://registry.npm.taobao.org/  参考这里

4. 运行后端。

双击运行nswag 下的refresh.bat  就可以生成 service-proxies.ts

5.原理跟踪:

  • .\node_modules\.bin\nswag 如下;

    1. @IF EXIST "%~dp0\node.exe" (
    2. "%~dp0\node.exe" "%~dp0\..\nswag\bin\nswag.js" %*
    3. ) ELSE (
    4. @SETLOCAL
    5. @SET PATHEXT=%PATHEXT:;.JS;=;%
    6. node "%~dp0\..\nswag\bin\nswag.js" %*
    7. )
    1. nswag.js
    1. #!/usr/bin/env node
    2. "use strict";
    3.  
    4. var defaultCoreVersion = "";
    5. var supportedCoreVersions = ["", "", "", ""];
    6.  
    7. // Initialize
    8. process.title = 'nswag';
    9. console.log("NSwag NPM CLI");
    10. var args = process.argv.splice(, process.argv.length - ).map(function (a) { return a.indexOf(" ") === - ? a : '"' + a + '"' }).join(" ");
    11.  
    12. // Legacy support
    13. args = args.replace("--x86", "/runtime:WinX86");
    14. args = args.replace("/runtime:x86", "/runtime:WinX86");
    15. args = args.replace("--core 1.0", "/runtime:NetCore10");
    16. args = args.replace("--core 1.1", "/runtime:NetCore11");
    17. args = args.replace("--core 2.0", "/runtime:NetCore20");
    18. args = args.replace("--core 2.1", "/runtime:NetCore21");
    19. args = args.replace("--core", "/runtime:NetCore" + defaultCoreVersion);
    20.  
    21. // Search for full .NET installation
    22. var hasFullDotNet = false;
    23. var fs = require('fs');
    24. if (process.env["windir"]) {
    25. try {
    26. var stats = fs.lstatSync(process.env["windir"] + '/Microsoft.NET');
    27. if (stats.isDirectory())
    28. hasFullDotNet = true;
    29. }
    30. catch (e) {
    31. console.log(e);
    32. }
    33. }
    34.  
    35. var c = require('child_process');
    36. if (hasFullDotNet && args.toLowerCase().indexOf("/runtime:netcore") == -) {
    37. // Run full .NET version
    38. if (args.toLowerCase().indexOf("/runtime:winx86") != -) {
    39. var cmd = '"' + __dirname + '/binaries/Win/nswag.x86.exe" ' + args;
    40. var code = c.execSync(cmd, { stdio: [, , ] });
    41. } else {
    42. var cmd = '"' + __dirname + '/binaries/Win/nswag.exe" ' + args;
    43. var code = c.execSync(cmd, { stdio: [, , ] });
    44. }
    45. } else {
    46. // Run .NET Core version
    47. var defaultCmd = 'dotnet "' + __dirname + '/binaries/NetCore' + defaultCoreVersion + '/dotnet-nswag.dll" ' + args;
    48. var infoCmd = "dotnet --version";
    49. c.exec(infoCmd, (error, stdout, stderr) => {
    50. for (let version of supportedCoreVersions) {
    51. var coreCmd = 'dotnet "' + __dirname + '/binaries/NetCore' + version + '/dotnet-nswag.dll" ' + args;
    52.  
    53. if (args.toLowerCase().indexOf("/runtime:netcore" + version) != -) {
    54. c.execSync(coreCmd, { stdio: [, , ] });
    55. return;
    56. } else {
    57. if (!error) {
    58. var coreVersion = stdout;
    59. if (coreVersion.indexOf(version + ".0") !== -) {
    60. c.execSync(coreCmd, { stdio: [, , ] });
    61. return;
    62. }
    63. }
    64. }
    65. }
    66. c.execSync(defaultCmd, { stdio: [, , ] });
    67. return;
    68. });
    69. }

Swagger 实践 <二>的更多相关文章

  1. ASP.NET MVC5 网站开发实践(二) Member区域–管理列表、回复及删除

    本来想接着上次把这篇写完的,没想到后来工作的一些事落下了,放假了赶紧补上. 目录: ASP.NET MVC5 网站开发实践 - 概述 ASP.NET MVC5 网站开发实践(一) - 项目框架 ASP ...

  2. ASP.NET MVC5 网站开发实践(二) Member区域–我的咨询列表及添加咨询

    上次把咨询的架构搭好了,现在分两次来完成咨询:1.用户部分,2管理部分.这次实现用户部分,包含两个功能,查看我的咨询和进行咨询. 目录: ASP.NET MVC5 网站开发实践 - 概述 ASP.NE ...

  3. ASP.NET MVC5 网站开发实践(二) Member区域 - 咨询管理的架构

    咨询.留言.投诉等功能是网站应具备的基本功能,可以加强管理员与用户的交流,在上次完成文章部分后,这次开始做Member区域的咨询功能(留言.投诉都是咨询).咨询跟文章非常相似,而且内容更少.更简单. ...

  4. ASP.NET MVC5 网站开发实践(二) Member区域 - 修改及删除文章

    上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个TryUpdateModel部分更新模型数据.   目录: ASP.N ...

  5. ASP.NET MVC5 网站开发实践(二) Member区域 - 全部文章列表

    显示文章列表分两块,管理员可以显示全部文章列表,一般用户只显示自己的文章列表.文章列表的显示采用easyui-datagrid.后台需要与之对应的action返回json类型数据   目录 ASP.N ...

  6. ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章

    上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东 ...

  7. ASP.NET MVC5 网站开发实践(二) Member区域 - 文章管理架构

    上次把member的用户部分完成,现在开始做文章管理部分.文章部分根据涉及显示现实文章列表,发布文章,修改文章,删除文章等功能.最终的实现目标是使用权限来控制用户是否能进行相应操作,管理员权限的会显示 ...

  8. ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(3)修改资料、修改密码

    在上一篇博客中实现了用户的注销和登录,其实代码里落了点东西,就是用户登录要更新最后一次登录时间和登录IP,这次补上.今天做修改资料和修改密码,TryUpdateModel是新用到的东西. 目录: AS ...

  9. ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(2)用户登录、注销

    上次实现了用户注册,这次来实现用户登录,用到IAuthenticationManager的SignOut.SignIn方法和基于声明的标识.最后修改用户注册代码实现注册成功后直接登录. 目录: ASP ...

随机推荐

  1. 灵活使用ssh、dsh和pssh高效管理大量计算机

    http://os.iyunv.com/art/201012/240113.htm 灵活使用ssh.dsh和pssh高效管理大量计算机 http://os.iyunv.com2010-12-23 09 ...

  2. error: cannot connect to daemon解决办法

    本文链接:https://blog.csdn.net/ipinki1218/article/details/80704806运行adb shell时出现error: cannot connect to ...

  3. 数字图像处理--算术、几何、谐波、逆谐波均值滤波器Matlab

    本文链接:https://blog.csdn.net/Dooonald/article/details/78545461算术均值 close all clear all f=imread('D:/te ...

  4. 技术干货丨如何在VIPKID中构建MQ服务

    小结: 1. https://mp.weixin.qq.com/s/FQ-DKvQZSP061kqG_qeRjA 文 |李伟 VIPKID数据中间件架构师 交流微信 | datapipeline201 ...

  5. vue页面刷新重定向

    在App.vue中,添加如下代码: created(){ if(this.$router.path !== '/RealTimeMonitoring'){ this.$router.replace(' ...

  6. ISO/IEC 9899:2011 条款5——5.2.2 字符显示语义

    5.2.2 字符显示语义 1.活动位置是在一个显示设备上的位置,由fputc函数所输出的下一个字符会出现在那个位置上.写一个打印字符(由isprint函数)到显示设备的意图是为了在活动位置上显示那字符 ...

  7. Qt编写自定义控件40-导航进度条

    一.前言 导航进度条控件,其实就是支付宝.京东.淘宝订单页面的进度控件,提示当前第几步,总共有几步,然后当前进度特殊颜色显示,每个进度带有时间文字等信息,本控件特意将三种样式风格都集成进去了,京东订单 ...

  8. JEECG中修改时间相关自定义定时器

    JEECG中使用,如下: @InitBinder public void initBinder(ServletRequestDataBinder binder) { binder.registerCu ...

  9. 01.轮播图之四 :imageViews(2 或者 3 个imageview) 轮播

    首先说下 3 个imageView的轮播,这个逻辑分析起来 比较简单, 先上传个图片吧::::: 主要分析起来,核心就是这样 :新的图片永远是加在中间ImageView上的,下一轮的第一张图片,是上一 ...

  10. 如何禁用maven下载进度指示?

    方法 mvn -B ..或者mvn --batch-mode ...