WSS自定义页面的发布过程记录2

刚学WSS不久,之前在测试服务器上面做了个自定义页面的WSS网页,需要把它发布到生产服务器上面。这篇文章只是记录了发布的一些需要注意的步骤,仅作为今后可以回头参考的资料,可能不是很正规的做法。备忘而已。

1、把编译好的源码从测试环境拷贝到生产服务器上面

 

001 拷贝源码

2、由于在生产环境服务器上面没有安装VS2008,需要先把GAC注册工具也拷贝到生产服务器上面

002 拷贝gacutil

3、修改部署文件的批处理文件,把Gacutil的路径修改成步骤2实际保存的路径

003 修改GACUTIL的路径

4、运行Intall.bat文件,进行工程各种文件的拷贝和注册DLL,安装Feature

004 运行install.bat文件

5、尝试访问自定义的页面,此时系统报错,原因是还缺少一些文件。因为这些文件分散在测试环境里,在第一次部署的时候,不知道这些文件应该放在哪个地方。通过这个模拟的部署过程,就可以了解这些文件哪些是必须的,哪些是可以省略的。今后就可以花时间做一个安装包,直接运行安装包即可。

005 尝试访问MR网页

6、由于之前修改过子网站的几个MasterPage,需要把这几个MasterPage也拷贝到生产服务器上面

006 拷贝Master文件

7、然后在生产服务器上面的SiteCollection上面创建那些业务上需要的列表

007 创建用来Lookup的List

8、创建文档库

008 创建MR Documents文档库

9、创建图片库

009 创建Sales Photo图片库

10、打开生产服务器上面的WSS站点的web.config文件,配置Sefecontrol节点,把工程生成的DLL配置成SafeControl

010 配置SafeControl

11、修改web.config文件,使WSS站点增加Ajax的支持

011 配置Ajax00

011 配置Ajax01

011 配置Ajax02

12、配置完Ajax后,之前创建的Admin页面已经可以运行了

012 Admin页面已经可以访问

13、其他页面还是出错 

012 其他页面还是出错

14、由于工程中使用到Enterprise Library,需要把用到的DLL在生产环境的GAC中进行注册,先把相关的DLL拷贝过来

013 拷贝Enterprise Library

15、用Gacutil这个工具将以下几个DLL注册到GAC

014 用gacutil注册dll01

014 用gacutil注册dll02

16、Admin页面里面的按钮也可以运行了,Sales和Brand的数据已经被成功初始化

015 Admin页面可以正常运行

 

17、修改web.config文件,使WSS站点能够使用Session

017 打开Session开关

18、把工程用到的两个sitemap文件也拷贝到生产服务器上面

 018 拷贝两个sitemap文件

19、配置Sitemap Provider

019 配置Sitemap Provider

20、Search页面也可以运行了,但是由于一些图片的路径不对,没有正确显示。这是由于代码里面直接指定了服务器的名字造成的,今后要花时间把它们写到CSS里面,不能偷懒;

020 Search页面可以运行  

21、把缺少的图片也拷贝过来

021 把图片拷贝过来

22、用Gacutil注册工程用到的第三方工具,这些DLL可以帮助我们用select * from xxx之类的语法查询WSS的自定义列表里面的数据,非常方便。

022 用gacutil注册caml工具

23、但是按Search页面里面的按钮,仍然出现错误。Ajax把相应的错误信息给屏蔽掉了,光看以下提示,不知是什么地方出错。

023 Search页面仍然出错   

24、经查,上面步骤出错,是因为我们使用到了Session来存放一些业务上的数据;

024 Search页面出错原因是TrimsPhoto不能Serialize

25、把Ajax屏蔽掉后,真正的错误原因显示出来了,原来是我们定义的TrimsPhoto类没有定义成可序列化的类。但是之前在测试服务器上面,同样没有定义成可序列化的类,为何能正常运行呢?这肯定是生产服务器上面web.config里面的配置和测试服务器上面的配置不一样。区别点在哪里呢?

025 Search页面出错原因是TrimsPhoto不能Serialize

26、通过一番查找和比较,终于发现在生产服务器上面有一行sessionState的配置,这个配置把Session的模式设置成了SQL Server。这就要求所有放在Session里面的对象必须能够被序列化。原因在此,于是干脆把这行代码给注释掉。

026 允许Session存放不序列化的对象

27、之前用Sharepoint Designer 2007修改过测试服务器上面的几个MasterPage,把一些不需要显示的内容隐藏起来了。也需要把这两个文件拷贝到生产服务器上面。先把这两个MasterPage从测试服务器上面下载下来。

027 下载这两个MasterPage 

28、然后上传到生产服务器上面

028 上传这两个MasterPage到新服务器

29、更换各个页面的MasterPage的路径

029 更换MasterPage文件01

029 更换MasterPage文件02

029 更换MasterPage文件03

029 更换MasterPage文件04

 029 更换MasterPage文件05

 029 更换MasterPage文件06

 029 更换MasterPage文件07

 029 更换MasterPage文件08

30、至此,自定义的页面已经可以运行了。

<think>好的,我现在需要解决用户提到的Python中与SSL/TLS版本相关的WebSocket安全连接错误。用户之前遇到的问题是升级到websockify0.9.0后需要配置TLS版本,但当前环境是xenial,可能还在使用旧版本的库,比如websockify0.8.0,这导致无法直接设置TLS1.2。用户引用的错误信息显示,尝试在ssl.wrap_socket中指定ssl_version=ssl.PROTOCOL_TLSv1_2可能不可行,因为出现了SecurityError,提示无法从HTTPS页面发起不安全的WebSocket连接。首先,我需要确认用户使用的Python版本和相关的库版本,比如websockify、ssl模块等。旧版本的Python(如2.7)可能默认使用较旧的TLS版本,而Python3.6+支持更现代的协议。此外,websockify的版本也很关键,0.8.0可能不支持配置TLS版本,而0.9.0通过补丁增加了相关支持。 接下来,可能的解决方案包括: 1. **升级依赖库**:建议用户升级到websockify0.9.0或更高版本,以便利用配置TLS版本的功能。但用户提到当前环境是xenial,可能需要处理依赖问题,比如通过虚拟环境或手动安装新版本。2.**修改Python代码显式设置TLS版本**:在创建SSL上下文时,明确指定使用的协议版本。例如,在Python的ssl模块中创建上下文时设置options=ssl.OP_NO_SSLv2 |ssl.OP_NO_SSLv3 |ssl.OP_NO_TLSv1,强制使用TLSv1.2或更高。需要注意Python版本是否支持这些选项。3.**处理SSL上下文传递**:如果使用第三方库(如websocket-client或websockets),需要确保SSL上下文正确传递给底层socket。可能需要重写部分连接逻辑,手动包装socket。 4. **检查服务器端配置**:确保服务器端支持TLS1.2,并且客户端与之兼容。有时错误可能由于服务器仅支持旧协议,而客户端强制使用新协议,或者相反。 5. **处理混合内容错误**:用户引用的SecurityError提到从HTTPS页面发起不安全的WS连接,这可能是因为前端使用了HTTPS,但后端WebSocket连接使用ws://而不是wss://。需要确保前端使用wss://协议,并且后端正确配置了SSL。6.**测试和验证**:建议用户使用工具如OpenSSL测试服务器支持的TLS版本,或在代码中捕获SSL错误,打印详细日志以便排查。在实施这些步骤时,需要注意兼容性问题,尤其是旧系统上的库可能存在的限制。另外,某些库可能有自己的SSL配置方式,需要查阅具体文档。例如,websockify可能在启动时有参数指定SSL选项,或者在代码中覆盖默认的SSL上下文。最后,可能需要综合应用多种方法,比如升级库、显式设置SSL选项、确保协议正确,并处理环境限制。同时,提供示例代码片段会帮助用户具体实施这些解决方案。</think>### Python中解决SSL/TLS版本相关的WebSocket安全连接错误的方法 #### 1. 确认环境及依赖版本 - **Python版本**:建议使用Python 3.6+,默认支持TLSv1.2+[^1]。 - **websockify版本**:升级到0.9.0+以支持TLS配置[^1]。 - **SSL库**:检查OpenSSL版本(`openssl version`),建议1.1.1+。 #### 2. 显式设置SSL/TLS版本 在代码中强制指定协议版本,避免使用不安全协议: ```python import ssl import websocket # 创建自定义SSL上下文 ssl_context = ssl.create_default_context() ssl_context.options |= ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1 ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2 # Python 3.7+ # 传递上下文到WebSocket连接 ws = websocket.WebSocket(sslopt={"context": ssl_context}) ws.connect("wss://example.com") ``` #### 3. 处理旧版本websockify的兼容性 若无法升级websockify,手动包装socket: ```python import socket import ssl from websockify.websocket import WebSocket def secure_socket(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) wrapped = ssl.wrap_socket( sock, ssl_version=ssl.PROTOCOL_TLSv1_2, cert_reqs=ssl.CERT_NONE # 根据实际情况调整 ) return wrapped ws = WebSocket() ws.sock = secure_socket() ws.connect("wss://example.com") ``` #### 4. 前端混合内容问题 确保前端使用`wss://`协议: ```javascript // 错误示例:HTTP页面发起WS连接 let ws = new WebSocket('ws://example.com'); // 触发SecurityError[^1] // 正确示例:HTTPS页面使用WSS let ws = new WebSocket('wss://example.com'); ``` #### 5. 服务器端配置验证 通过OpenSSL测试服务器支持的协议: ```bash openssl s_client -connect example.com:443 -tls1_2 ``` #### 6. 异常处理与日志 捕获SSL错误并记录详细信息: ```python try: ws.connect("wss://example.com") except websocket.WebSocketException as e: print(f"SSL/TLS Handshake Failed: {e}") except ssl.SSLError as e: print(f"SSL Error: {e.library}:{e.reason}") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值