篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python作为IIS服务器后台,客户端访问HTTPS 乱码求高人指点!!相关的知识,希望对你有一定的参考价值。
环境:win2012,IIS已绑定SSL,python3.6后台程序:from flask import Flask,requestapp = Flask(__name__)@app.route('/<tjlx>', methods=['GET'])def index(tjlx): return str(["Hello Flask!",tjlx])if __name__=='__main__': app.run(debug=True)测试http(正常):客户端:>>> import requests>>> r = requests.get('http://127.0.0.1:5000/0')>>> r.text"['Hello Flask!', '0']"服务器端:C:\IIS\hello>test2.py * Restarting with stat * Debugger is active! * Debugger PIN: 156-915-159 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)127.0.0.1 - - [12/Dec/2017 22:20:22] "GET /0 HTTP/1.1" 200 -测试https(乱码):客户端:>>> r = requests.get('https://127.0.0.1:5000/0')Traceback (most recent call last): File "C:\Python36\lib\site-packages\urllib3\connectionpool.py", line 601, in urlopen chunked=chunked) File "C:\Python36\lib\site-packages\urllib3\connectionpool.py", line 346, in _make_request。。。。。 resp = self.send(prep, **send_kwargs) File "C:\Python36\lib\site-packages\requests\sessions.py", line 618, in send r = adapter.send(request, **kwargs) File "C:\Python36\lib\site-packages\requests\adapters.py", line 506, in send raise SSLError(e, request=request)requests.exceptions.SSLError: HTTPSConnectionPool(host='127.0.0.1', port=5000):Max retries exceeded with url: /0 (Caused by SSLError(SSLError(1, '[SSL: UNKNOWN_PROTOCOL] unknown protocol (_ssl.c:777)'),))服务器端(如图):小白求高人指点!!多谢!!
通过IIS方式寄宿服务
之前的例子是将控制台作为WCF的寄宿方式或者是直接添加契约项目的引用,然后通过配置或者是ChannelFactory的形式进行创建服务对象,其实在大多的开发中以IIS的形式创建WCF也是比较常见的。
每一个Webservice都是具有一个asmx文本文件,客户端通过访问.asmx文件即可实现Webservice的调用。当然WCF和Webservice类似,每一个WCF服务都有一个对应的.svc文本文件。基于IIS服务寄宿要求的WCF服务都具有相应的.svc文件,.svc文件部署于IIS站点中,对WCF服务的调用提现在对.svc文件的访问上。.svc文件仅仅包含一个%@ ServiceHost这样的指令,该指令具有一个必须的Service属性和一些可选的属性,如下代码所示就是一个简单的.svc文本的内容
其中指定了Service属性为一个完整名称的WCF服务类。
寄宿在IIS下的WCF服务实际上就是一个WEB应用,所以通常会把.svc文件放在Web下,并且通过web.config文件进行配置WCF的终结点和用于发布元数据的ServiceMetadataBehavior服务行为。由于服务调用是通过访问服务对应的.svc文件来实现的,这个.svc文件所在的地址对于客户端来说就是服务(终结点)的地址,因此是不需要配置终结点的adder的,配置代码如下:
除了终结点没有指定address之外,服务行为ServiceMetadataBehavior用于元数据发布时也没有指定元素的发布地址。在这种情况下,.svc文件的地址加上?wsdl查询字符串就是元数据发布地址。对于当前例子来说,当服务被成功寄宿到本地的Web应用之后,就可以通过http://127.0.0.1:1111/网站名称/CalculatorService.svc?wdsl得到表示服务元数据的WSDL文件,这也就是为什么我们右键浏览.svc文件的时候返回的是很长的xml内容。
再次修改客户端:
仅仅修改了address属性,当前假设我们的Web应用程序叫做MyWeb,这也我们的address就可以找到发布后的.svc文件了。
至此,我们一共介绍了两大类的WCF的方法:
一种是将WCF服务寄宿在控制台程序:
1.通过添加服务引用(根据元数据的地址添加),然后创建了一个Client对象,然后就可以操作了;
2.通过添加对契约项目的引用,然后通过ChannelFactory创建了一个Channel对象(通过契约类型,Binding,以及一个地址);
3.通过添加对契约项目的引用,然后通过ChannelFactory创建了一个Channel对象(首先会在config中配置endpoint信息,然后通过endpoint的name作为 ChannelFactory的参数进行创建)。
一种是依靠IIS作为寄宿:
1.添加对契约项目的引用,然后通过修改配置文件的endpoint的address为.svc的地址,这样同样还是通过ChannelFactory方式进行创建代理对象;
2.添加契约项目的引用,然后通过ChannelFactory创建了一个Channel对象(通过契约类型,Binding,以及一个地址,这时候的地址应该是.svc)。