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,注意修改地址
    {
    "runtime": "Default",
    "swaggerGenerator": {
    "fromSwagger": {
    "url": "http://localhost:11934/swagger/v1/swagger.json",
    "output": null
    }
    },
    "codeGenerators": {
    "swaggerToTypeScriptClient": {
    "className": "{controller}ServiceProxy",
    "moduleName": "",
    "namespace": "",
    "typeScriptVersion": 2.0,
    "template": "Angular",
    "promiseType": "Promise",
    "httpClass": "HttpClient",
    "useSingletonProvider": false,
    "injectionTokenType": "InjectionToken",
    "rxJsVersion": 6.0,
    "dateTimeType": "OffsetMomentJS",
    "nullValue": "Undefined",
    "generateClientClasses": true,
    "generateClientInterfaces": false,
    "generateOptionalParameters": false,
    "wrapDtoExceptions": false,
    "wrapResponses": false,
    "generateResponseClasses": true,
    "responseClass": "SwaggerResponse",
    "useTransformOptionsMethod": false,
    "useTransformResultMethod": false,
    "generateDtoTypes": true,
    "operationGenerationMode": "MultipleClientsFromPathSegments",
    "markOptionalProperties": false,
    "generateCloneMethod": true,
    "typeStyle": "Class",
    "extensionCode": "service.extensions.ts",
    "generateDefaultValues": true,
    "excludedTypeNames": [],
    "handleReferences": false,
    "generateConstructorInterface": true,
    "convertConstructorInterfaceData": false,
    "importRequiredTypes": true,
    "useGetBaseUrlMethod": false,
    "baseUrlTokenName": "API_BASE_URL",
    "queryNullValue": "",
    "output": "../src/shared/service-proxies/service-proxies.ts"
    },
    "swaggerToCSharpClient": {
    "generateClientClasses": true,
    "generateClientInterfaces": false,
    "generateDtoTypes": true,
    "injectHttpClient": false,
    "disposeHttpClient": true,
    "generateExceptionClasses": true,
    "exceptionClass": "SwaggerException",
    "wrapDtoExceptions": true,
    "useHttpClientCreationMethod": false,
    "httpClientType": "System.Net.Http.HttpClient",
    "useHttpRequestMessageCreationMethod": false,
    "useBaseUrl": true,
    "generateBaseUrlProperty": true,
    "generateSyncMethods": false,
    "exposeJsonSerializerSettings": false,
    "clientClassAccessModifier": "public",
    "typeAccessModifier": "public",
    "generateContractsOutput": false,
    "parameterDateTimeFormat": "s",
    "generateUpdateJsonSerializerSettingsMethod": true,
    "serializeTypeInformation": false,
    "queryNullValue": "",
    "className": "{controller}Client",
    "operationGenerationMode": "MultipleClientsFromOperationId",
    "generateOptionalParameters": false,
    "generateJsonMethods": true,
    "parameterArrayType": "System.Collections.Generic.IEnumerable",
    "parameterDictionaryType": "System.Collections.Generic.IDictionary",
    "responseArrayType": "System.Collections.ObjectModel.ObservableCollection",
    "responseDictionaryType": "System.Collections.Generic.Dictionary",
    "wrapResponses": false,
    "generateResponseClasses": true,
    "responseClass": "SwaggerResponse",
    "namespace": "MyNamespace",
    "requiredPropertiesMustBeDefined": true,
    "dateType": "System.DateTime",
    "dateTimeType": "System.DateTime",
    "timeType": "System.TimeSpan",
    "timeSpanType": "System.TimeSpan",
    "arrayType": "System.Collections.ObjectModel.ObservableCollection",
    "dictionaryType": "System.Collections.Generic.Dictionary",
    "arrayBaseType": "System.Collections.ObjectModel.ObservableCollection",
    "dictionaryBaseType": "System.Collections.Generic.Dictionary",
    "classStyle": "Inpc",
    "generateDefaultValues": true,
    "generateDataAnnotations": true,
    "excludedTypeNames": [],
    "handleReferences": false,
    "generateImmutableArrayProperties": false,
    "generateImmutableDictionaryProperties": false,
    "output": null
    },
    "swaggerToCSharpController": {
    "controllerStyle": "Partial",
    "useCancellationToken": false,
    "aspNetNamespace": "System.Web.Http",
    "className": "{controller}",
    "operationGenerationMode": "MultipleClientsFromOperationId",
    "additionalNamespaceUsages": [
    "System.Web.Http"
    ],
    "generateOptionalParameters": false,
    "generateJsonMethods": true,
    "parameterArrayType": "System.Collections.Generic.IEnumerable",
    "parameterDictionaryType": "System.Collections.Generic.IDictionary",
    "responseArrayType": "System.Collections.ObjectModel.ObservableCollection",
    "responseDictionaryType": "System.Collections.Generic.Dictionary",
    "wrapResponses": false,
    "generateResponseClasses": true,
    "responseClass": "SwaggerResponse",
    "namespace": "MyNamespace",
    "requiredPropertiesMustBeDefined": true,
    "dateType": "System.DateTime",
    "dateTimeType": "System.DateTime",
    "timeType": "System.TimeSpan",
    "timeSpanType": "System.TimeSpan",
    "arrayType": "System.Collections.Generic.IEnumerable",
    "dictionaryType": "System.Collections.Generic.Dictionary",
    "arrayBaseType": "System.Collections.ObjectModel.ObservableCollection",
    "dictionaryBaseType": "System.Collections.Generic.Dictionary",
    "classStyle": "Inpc",
    "generateDefaultValues": true,
    "generateDataAnnotations": true,
    "excludedTypeNames": [],
    "handleReferences": false,
    "generateImmutableArrayProperties": false,
    "generateImmutableDictionaryProperties": false,
    "output": null
    }
    }
    }
  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 如下;

    @IF EXIST "%~dp0\node.exe" (
    "%~dp0\node.exe" "%~dp0\..\nswag\bin\nswag.js" %*
    ) ELSE (
    @SETLOCAL
    @SET PATHEXT=%PATHEXT:;.JS;=;%
    node "%~dp0\..\nswag\bin\nswag.js" %*
    )
  • nswag.js:
    #!/usr/bin/env node
    "use strict"; var defaultCoreVersion = "";
    var supportedCoreVersions = ["", "", "", ""]; // Initialize
    process.title = 'nswag';
    console.log("NSwag NPM CLI");
    var args = process.argv.splice(, process.argv.length - ).map(function (a) { return a.indexOf(" ") === - ? a : '"' + a + '"' }).join(" "); // Legacy support
    args = args.replace("--x86", "/runtime:WinX86");
    args = args.replace("/runtime:x86", "/runtime:WinX86");
    args = args.replace("--core 1.0", "/runtime:NetCore10");
    args = args.replace("--core 1.1", "/runtime:NetCore11");
    args = args.replace("--core 2.0", "/runtime:NetCore20");
    args = args.replace("--core 2.1", "/runtime:NetCore21");
    args = args.replace("--core", "/runtime:NetCore" + defaultCoreVersion); // Search for full .NET installation
    var hasFullDotNet = false;
    var fs = require('fs');
    if (process.env["windir"]) {
    try {
    var stats = fs.lstatSync(process.env["windir"] + '/Microsoft.NET');
    if (stats.isDirectory())
    hasFullDotNet = true;
    }
    catch (e) {
    console.log(e);
    }
    } var c = require('child_process');
    if (hasFullDotNet && args.toLowerCase().indexOf("/runtime:netcore") == -) {
    // Run full .NET version
    if (args.toLowerCase().indexOf("/runtime:winx86") != -) {
    var cmd = '"' + __dirname + '/binaries/Win/nswag.x86.exe" ' + args;
    var code = c.execSync(cmd, { stdio: [, , ] });
    } else {
    var cmd = '"' + __dirname + '/binaries/Win/nswag.exe" ' + args;
    var code = c.execSync(cmd, { stdio: [, , ] });
    }
    } else {
    // Run .NET Core version
    var defaultCmd = 'dotnet "' + __dirname + '/binaries/NetCore' + defaultCoreVersion + '/dotnet-nswag.dll" ' + args;
    var infoCmd = "dotnet --version";
    c.exec(infoCmd, (error, stdout, stderr) => {
    for (let version of supportedCoreVersions) {
    var coreCmd = 'dotnet "' + __dirname + '/binaries/NetCore' + version + '/dotnet-nswag.dll" ' + args; if (args.toLowerCase().indexOf("/runtime:netcore" + version) != -) {
    c.execSync(coreCmd, { stdio: [, , ] });
    return;
    } else {
    if (!error) {
    var coreVersion = stdout;
    if (coreVersion.indexOf(version + ".0") !== -) {
    c.execSync(coreCmd, { stdio: [, , ] });
    return;
    }
    }
    }
    }
    c.execSync(defaultCmd, { stdio: [, , ] });
    return;
    });
    }

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. centos7 windows7 双系统重新构建引导和启动顺序

    安装centos后无法引导启动windows7的解决方法 在电脑Windows7系统上安装Centos7,安装后找不到Windows7引导菜单. 原因:因为CentOS 7已采用新式的grub2系统, ...

  2. 临界区代码 critical section Locks and critical sections in multiple threads

    临界区 在同步的程序设计中,临界区段(Critical section)指的是一个访问共享资源(例如:共享设备或是共享存储器)的程序片段,而这些共享资源有无法同时被多个线程访问的特性. 当有线程进入临 ...

  3. mac下如何安装python3?

    1. 安装homebrew $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/insta ...

  4. 浅析angular,react,vue.js jQuery-1

    作者:尚春链接:https://www.zhihu.com/question/38989845/answer/79201080来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  5. PAT 甲级 1032 Sharing (25 分)(结构体模拟链表,结构体的赋值是深拷贝)

    1032 Sharing (25 分)   To store English words, one method is to use linked lists and store a word let ...

  6. python 高阶函数、柯里化

    高阶函数 First Class Object 函数在python中是一等公民 函数也是对象,可调用的对象 函数可作为普通变量.参数.返回值等等 高阶函数 数学概念 y=g(f(x)) 在数学和计算机 ...

  7. [CareerCup] Single Valid Tree

    https://www.careercup.com/question?id=5103530547347456 Given a list of nodes, each with a left child ...

  8. Java基础教程:IDEA单元测试

    Java基础教程:IDEA单元测试 环境配置 使用idea IDE 进行单元测试,首先需要安装JUnit 插件. 安装JUnit插件步骤 File-->settings-->Plguins ...

  9. [逻辑学]意外绞刑悖论(Hangman paradox)(又称意外考试悖论)

    绞刑 在审讯中一位囚徒被法官判处死刑.判决如下:“你下周将会被处决,但哪天处决对你来说是一个惊喜.”囚徒因此作出如下推理:“假如处决日是周日,那么在周六夜晚降临后,我将提前知道我周日会被处决,那样的话 ...

  10. iCMSv7.0.15后台database.admincp文件仍存在SQL注入漏洞

    闲着无聊,国庆时间没事做,又在Q群看到这种公告,只好下个icms慢慢玩.(PS:医院和学校居然都关网站了) 无奈自己太菜,审不出问题.只好上网百度icms之前的漏洞.然后居然成功在iCMSv7.0.1 ...