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>
时间: 2024-10-23 07:48:31

2种方式解决nginx负载下的Web API站点里swagger无法使用的相关文章

使用redis解决tomcat6在nginx负载下多节点共享session问题

使用redis共享tomcat多节点session,需要安装redis.nginx.tomcat6以及用于tomcat存储session到redis的jar包:tomcat-redis-session-manager-1.2-tomcat-6.jar. commons-pool-1.6.jar.jedis-2.1.0.jar等.这些jar包.配置文件及demo程序可以在最后的demo地址中下载. 下面是对tomcat.nginx进行配置及运行: 1.把demo包中的jar包拷贝到tomcat的l

解决nginx负载均衡的session共享问题

PHP服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态,下面提供了几种方式来解决session共享的问题: 1.不使用session,换用cookie session是存放在服务器端的,cookie是存放在客户端的,我们可以把用户访问页面产生的session放到cookie里面,就是以cookie为中转站.你访问web服务器A,产生了session然后把它放到cookie里面,当你的

怎么样 解决nginx负载均衡的session共享问题呢

php服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态,下面提供了几种方式来解决session共享的问题: 1.不使用session,换用cookie session是存放在服务器端的,cookie是存放在客户端的,我们可以把用户访问页面产生的session放到cookie里面,就是以cookie为中转站.你访问web服务器A,产生了session然后把它放到cookie里面,当你的

解决nginx负载均衡的session共享问题 (转)

转: http://blog.csdn.net/xluren/article/details/16951247 查了一些资料,看了一些别人写的文档,总结如下,实现nginx session的共享 PHP服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态,下面提供了几种方式来解决session共享的问题: 1.不使用session,换用cookie session是存放在服务器端的,co

三种方式解决你的js加载乱码

第一种方式——编码统一 我们以前觉得出现乱码的原因是因为编码不统一,就是因为我们设置编码统一之后,就解决了问题,所以,让html和js的编码统一,是最简单的一个乱码解决方式,原因是什么,是因为,如果你在加载js的时候,并没有声明js的编码格式,那么浏览器会默认的按照当前html的编码格式进行解析引入的js文件,如果你的js和本身页面编码不一样,并且js中引入了中文字符,那么肯定会出现乱码的.要知道,程序都是笨笨的. 第二种方式——在引入js的标签中加入charset属性 这样引入,那么这个xx.

解决Nginx环境下WordPress后台缺少”Wp-Admin”路径

在nginx环境下访问有时访问wordpress后台会直接返回错误.仔细发现路径少了wp-admin,解决方法很简单在/usr/local/nginx/conf/wordpress.conf文件进行修改 location / { index index.html index.php; if (-f $request_filename/index.html){ rewrite (.*) $1/index.html break; } if (-f $request_filename/index.ph

IIS6中给Framework2,。0站点的虚拟目录(2.0版本)下发布Web API项目(4.0版本)问题处理

Web-API项目以虚拟目录形式部署到IIS6/IIS7 若原有站点为Framework2.0版本,在此站点(或虚拟目录站点)下,新增API虚拟目录,然后选择Framework4.0版本,IIS6和IIS7配置有所不同. IIS6配置: 1)        在主站A中的web.config中,添加<location>节点,要包住<system.web> 和<system.codedom>,节点内容如下: <location path="." a

2种方式解决vue路由跳转未匹配相应路由避免出现空白页面或者指定404页面

https://www.cnblogs.com/goloving/p/9254084.html https://www.cnblogs.com/goloving/p/9254084.html 1.路由全局守卫 在做项目的时候,遇到需要做路由跳转,但当用户输入错误url地址,或是其它非法url路由地址,我们或许会想到跳转至404页面.不管你有没有写一个404页面,当出现未匹配路由都需重新指定页面跳转.可能大家首先想到会是路由重定向,redirect来解决这个问题.但实际上通过redirect是没办

两种方式解决 生产者消费者问题

一.通过wait().notify()线程通信来实现 输出结果: 二.通过阻塞队列来解决生产者消费者问题 输出结果: 由输出结果可以看出:"最后阻塞队列中还剩下4个鸡蛋"明显是正确的,可知阻塞队列内部意见实现了同步,不需要我们额外同步,是线程安全的.