2种方式解决nginx负载下的Web API站点里swagger无法使用
Web API接口站点,引入了swagger来实时生成在线的api文档,也便于api接口的在线测试。swagger:The World's Most Popular Framework for APIs.
本地测试没有问题。 发布到生产,问题出现了。——线上部署的站点是用nginx做的3个节点的负载。nginx配置了公开的域名,并且与3个节点iis上的站点做了映射。3个单节点的端口不是默认的80,由此问题产生了:当访问swagger时,swagger自动获取的文档的url包含了这个端口,因为站点对外公开的仅仅是域名,用端口访问不了,所以,取不到swagger文档了。
当然,手动把这个explorer里的端口去掉是可以显示出来接口列表的。
类似的问题还出现在当模拟调用一个接口时,由于同时显示了端口,所以无法将请求发送到服务端,导致错误响应。见下图:
由于swagger的代码是集成到了一个dll里了,项目文件中并没有swagger的任何静态脚本、图片、样式文件,我们没办法修改其源码。
我曾试图将这个疑问提到csdn论坛里http://bbs.csdn.net/topics/391964196,得到的多是不明我意的批判。
昨天,突然想到,是否可以通过截获http响应,然后修改其响应内容呢(即去掉响应内容里的那个端口)。
通过在程序站点的Global.ascx.cx里尝试通过EndRequest事件,行不通。
接下来,叫来开发组里2个同学,说明情况后,一个同学说可以通过拦截http请求来搞定。
第二天,他果真实现了。 通过chrome浏览器的调试工具推断出来影响这2个地方的,来自于swagger的2个js文件。然后,我们从chrome里获取到这2个js代码,修改其中获取网站url的代码(如果是生产环境域名,则replace掉端口),然后把js文件保存在网站文件的Scripts文件夹里,最后在Global.ascx.cx里做请求拦截处理。
- protected void Application_BeginRequest(object sender, EventArgs e)
- {
- if (Request.Url.ToString().Contains("marked-js"))
- {
- Response.Redirect("/Scripts/swagger-oauth.js");
- }
- else if (Request.Url.ToString().Contains("swagger-ui-min-js"))
- {
- Response.Redirect("/Scripts/swagger-ui-min.js");
- }
- }
我这边还有一个解决办法,既然通过浏览器调试工具的network里可以看到调用的js,那么,我们把上面方法里的修改后的js文件,生成一份与其引用路径相同的目录结构,放到站点文件里。就可以了。
这时,需要注意的一个问题是,swagger ui引用的swagger的js没有扩展名, 而无扩展名的文件在浏览器里默认是不允许访问的,所以,需要加mime类型,在iis里设置或在web.config里加配置均可(对于无后缀的文件,扩展名需填写“.”符号,参考http://www.zhaomu.com/news/detail-393.html)。
- <configuration>
- <system.webServer>
- <staticContent>
- <mimeMap fileExtension="." mimeType="text/javascript" />
- </staticContent>
- </system.webServer>
- </configuration>
2种方式解决nginx负载下的Web API站点里swagger无法使用的更多相关文章
- nginx负载下站点错误响应会导致其他节点重复响应问题的解决过程
目录 前言 问题来了 问题又来了 问题分析 困惑 转机 后续 前言: 这是我上周工作过程中的一次解决问题的过程.解决的是nginx负载下站点错误响应导致其他节点重复响应. 我在整理这个记叙文时,在给这 ...
- 网站nginx负载下因程序错误导致多节点重复处理请求的解决过程
目录 前言 问题来了 问题又来了 问题分析 困惑 转机 后续 前言: 这是我上周工作过程中的一次解决问题的过程.解决的是nginx负载环境下,因为应用程序异常导致某一请求被多节点站点重复处理的问题. ...
- 怎么样 解决nginx负载均衡的session共享问题呢
php服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态,下面提供了几种方式来解决ses ...
- 【转载】解决nginx负载均衡的session共享问题
https://blog.csdn.net/u012081441/article/details/71787164 之前有写过ubuntu环境下搭建nginx环境,今天来谈一下nginx sessio ...
- 几个常见用于解决nginx负载均衡的session共享问题的办法
查了一些资料,看了一些别人写的文档,总结如下,实现nginx session的共享: PHP服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果sessio ...
- 三种方式解决你的js加载乱码
第一种方式——编码统一 我们以前觉得出现乱码的原因是因为编码不统一,就是因为我们设置编码统一之后,就解决了问题,所以,让html和js的编码统一,是最简单的一个乱码解决方式,原因是什么,是因为,如果你 ...
- 解决nginx负载均衡高可用keepalived只针对物理机的问题
在高可用keepalived软件,在默认的情况下仅仅在对方机器宕机或keepalived停掉的时候才会接管业务. 但是在实际工作过程中,例如在nginx负载均衡工作实例中,nginx服务已停止,而ke ...
- IIS6中给Framework2,。0站点的虚拟目录(2.0版本)下发布Web API项目(4.0版本)问题处理
Web-API项目以虚拟目录形式部署到IIS6/IIS7 若原有站点为Framework2.0版本,在此站点(或虚拟目录站点)下,新增API虚拟目录,然后选择Framework4.0版本,IIS6和I ...
- ASP.NET第一次访问慢的解决方法(MVC,Web Api)
问题现象 访问asp.net web项目的时候,第一次访问比较慢,当闲置一段时间后,再次访问还是会非常慢. 问题原因 这是IIS回收造成的,再次访问的时候会初始化操作,初始化需要耗费时间,所以访问会比 ...
随机推荐
- linux系统编程之I/O内核数据结构
文件在内核中是用三种数据结构进行表示的 (1)文件描述符表:文件描述符表是一个结构体数组,数组的下标就是open函数返回的文件描述符. 文件描述符表的每一个记录有两个字段 *文件描述符标志 * 文 ...
- crack.vbs病毒,优盘里所有文件全变成快捷方式
去了一趟学校打印店,用优盘copy打印了点东西,当时在打印店电脑里打开优盘的时候里面就变成了快捷方式,但没怎么在意.回来之后在自己电脑上居然也这样了.网上一搜是中了crack.vbs病毒了.格式化优盘 ...
- 2014NOIP前 计划
这几天天天刷水题活得很开心,是时候定一个计划了.想着我要在yzy左的吓人的歌声中看书,还是有点.... 大概就分成几类吧 数学//你们这群学霸啊 搜索 图论 dp 贪心 其他 每个不定具体时间,加油吧 ...
- java抽象语法
1.基本概念: 0.0.抽象类的定义:抽象类是为子类提供一个规范,其目地是由子类去继承实现(类似国家提出的法律,由我们去执行). 0.1.定义抽象类用abstract来定义. 语法: public a ...
- jquery实现手风琴效果
html----accordion.html <!DOCTYPE html> <html lang="en"> <head> <meta ...
- JS 跨源请求
一个 URL 大概包含的部分:scheme://host:port/path?#hash 比如一个 URL 为 http://www.xxx.com:8888/school/student.html, ...
- this、super关键字
this关键字 this 关键字用来表示当前对象本身,或当前类的一个实例,通过 this 可以调用本对象的所有方法和属性. public class Demo{ public int x = 10; ...
- LINUX 虚拟机克隆与网络配置
虚拟机克隆后,启动之后发现网卡没有启动.发现提示错误信息“Device eth0 does not seem to be present, delaying initialization.” 解决方法 ...
- C#is运算符的作用
is运算符的含义:检查对象是不是给定类型,或者是否可以转换为给定类型,如果是,这个运算符就返回True. is运算符的语法:<operand> is <type> 这个表达式的 ...
- oracle 抛出自定义错误(网上找的例子)
CREATE OR REPALCE TRIGGER minimun_age_checkBEFORE INSERT ON employeeFOR EACH ROWBEGIN IF ADD_MONTHS( ...