纯IronPython实现WCF Service
前面的Blog中简单说明了如何利用IronPython的clrtype实现.NET中的接口,有了这些功能做为前提,我们就可以使用IronPython实现WCF服务,并且调用WCF服务(并非利用C#扩展)。
实现WCF服务,对于IronPython来讲有两点是最重要的,1.如何实现.NET Interface,2.如何实现特性类(Attribute Class),实现Interface的过程,请参考前面的Blog,本次主要说明如何实现Attribute Class。
先看一个C#版本的WCF服务实现,代码如下:
[ServiceContract]
public interface IService
{
[OperationContract]
string GetAge(int age);
}
public class Service : IService
{
#region IService Members
public string GetAge(int age)
{
return "hello " + age.ToString();
}
#endregion
}
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof (Service),new Uri("http://localhost/Service"));
host .AddServiceEndpoint (typeof (IService ),new WSHttpBinding(),"");
host.Open();
Console.WriteLine("started");
Console.Read();
}
与之对应的Python代码如下所示:
# coding=gb2312
import clr
import clrtype
clr.AddReference("System.ServiceModel")
from System import Console, Uri
from System.ServiceModel import (ServiceContractAttribute,
OperationContractAttribute,
ServiceHost, WSHttpBinding,
ServiceBehaviorAttribute,
)
OperationContract = clrtype.attribute(OperationContractAttribute)
#定义接口
class IService(object):
__metaclass__ = clrtype.ClrInterface#声明该类为接口类型
_clrnamespace = "TestWCF"#添加命名空间
#为ISerivce接口添加ServiceContractAttribute
_clrclassattribs = [ServiceContractAttribute]
@OperationContract()#用OperationContractAttribute修饰GetAge方法
@clrtype.accepts(int)#声明参数age为int类型
@clrtype.returns(str)#声明返回值为string类型
def GetAge(self, age):
raise RuntimeError("this should not get called")
#定义类
class Service(IService):
__metaclass__ = clrtype.ClrClass
_clrnamespace = "TestWcf"
_clrclassattribs = [ServiceBehaviorAttribute]
def GetAge(self, age):
return "hello " + str(age)
sh = ServiceHost(clr.GetClrType(Service), Uri("http://localhost/Service"))
sh.AddServiceEndpoint(clr.GetClrType(IService), WSHttpBinding(), "")
sh.Open()
Console.WriteLine("host started")
Console.Read()
从代码量上看Python要多于C#,从运行效率上看,二都基本上是差不多的。
如果利用IronPython调用WCF,关键是要声明接口,其他的都和C#的方式是一样的,这里就不多说了。
大家如果有什么问题,请给我发Email:warensoft@foxmail.com