WebService除了比较常见的soap,restful等形式外,在.net平台下比较多的是wcf服务。
具体介绍可以参看MSDN里的描述。
如何对wcf服务接口进行测试,除了写.net代码外,还可以通过ironpython来实现(谁让ironpython就是python在.net平台上实现呢)

调用wcf服务,就需要知道wcf服务的这三个方面:

  1. 契约 。wcf规定,契约必须要以接口的方式来体现,实际的服务代码必须要由这些合约接口派生并实现)

  2. 绑定。WCF 支持HTTP,TCP,Named Pipe,MSMQ,Peer-To-Peer TCP 等协议,而 HTTP 又分为基本 HTTP 支持 (BasicHttpBinding) 以及 WS-HTTP 支持 (WsHttpBinding),而 TCP 亦支持 NetTcpBinding,NetPeerTcpBinding 等通信方式。

  3. 安全性。

了解了wcf以上的内容后,就可以进行调用了。
比如有一个wcf服务(http_binding的),契约都定义在IUserService中,它里面有一个方法是tmethod.
需要调用该wcf服务中的tmethod方法

import clr
clr.AddReference('System.ServiceModel')
from System.ServiceModel import (ServiceHost, BasicHttpBinding,NetTcpBinding,
    ServiceBehaviorAttribute, InstanceContextMode,Description,SecurityMode,WSHttpBinding)
try:
    clr.AddReference('Services.Contract')
except Exception,ex:
    raise  AssertionError("%s" % ex)
from Services.Contract import IUserService


sec_mode = System.ServiceModel.NetTcpSecurity()
sec_mode.Mode = System.ServiceModel.SecurityMode.None

#绑定
def basic_http_binding():
    http_binding = System.ServiceModel.BasicHttpBinding()
    http_binding.TextEncoding = Text.Encoding.UTF8
    http_binding.MaxBufferPoolSize = 52428800
    http_binding.ReceiveTimeout=TimeSpan(0, 1, 30)
    http_binding.MaxReceivedMessageSize = 52428800
    return http_binding


class TestWcf(object):
    def __init__(self, service_url):
        self.service_url = service_url
    
    #createchannel的方式和C#类似,主要是ChannelFactory的使用
    def __create_channel(self):
        mycf = System.ServiceModel.ChannelFactory[IUserService](
            basic_http_binding(),
            System.ServiceModel.EndpointAddress(self.service_url))
        wcfcli = mycf.CreateChannel()
        return wcfcli

    def test_tmethod(self):
        rst = self.__create_channel().tmethod()
        print rst

然后就可以实例化TestWcf类,然后调用test_tmethod来获取对应服务的返回值了
上面使用的是http_binding的形似,使用net_tcp_bing的一样的

sec_mode = System.ServiceModel.NetTcpSecurity()
sec_mode.Mode = System.ServiceModel.SecurityMode.None
def basic_net_tcp_binding():
    tcp_binding = System.ServiceModel.NetTcpBinding()
    tcp_binding.MaxBufferPoolSize = 52428800
    tcp_binding.ReceiveTimeout=TimeSpan(0, 1, 30)
    tcp_binding.MaxReceivedMessageSize = 52428800
    tcp_binding.Security = sec_mode
    return tcp_binding    

agentwx
354 声望23 粉丝

引用和评论

0 条评论