- 论坛徽章:
- 0
|
最近一个Perl写的Server需要去调用公司的SSO认证,她们是以 .net 的 webservice方式提供服务的。具体访问就是走SOAP的方式。
跨主机远程函数调用,并且还能语言独立,我想这是每个程序员的梦想,SOAP就是不错的技术实现。但是不要期待SOAP能提供你自己写的很多底层代码一样高的效率。
写了一下Perl调用Soap服务的代码,如下为perl MVC框架Catalyst中的代码,放在Root.pm中,所有的页面都会经过此处认证了:
- sub auto: Private {
- my ($self, $c) = @_;
- unless ($c->session->{user_id}){
- if ($c->req->param('ticket')) {
- use SOAP::Lite;
- my $soap = SOAP::Lite
- ->uri('http://indigo.oa.com/services')
- ->on_action( sub { join '/', 'http://indigo.oa.com/services', $_[1] } )
- ->proxy('http://192.168.1.205/services/passportservice.asmx?WSDL');
- my @params = ( SOAP::Data->name(encryptedTicket => $c->req->param('ticket')));
- my $method =SOAP::Data->name('DecryptTicket')->attr({xmlns => 'http://indigo.oa.com/services/'});;
- my $result=$soap->call($method => @params)->result;
- unless( $result->{LoginName}) {
- $c->log->debug("Ticket Auth Error,Please Login Again!");
- $c->response->redirect("http://passport.oa.com/modules/passport/signin.ashx?url=" . uri_escape('http://db.ied.com'));
- }
- else {
- $c->log->debug("Ticket Auth OK, The LoginName is " . $result->{LoginName});
- $c->session->{user_id} = $result->{LoginName};
- return 1;
- }
- }
- else {
- #$c->log->debug(Dumper($c->session));
- #$c->log->debug($c->req->uri);
- $c->response->redirect("http://passport.oa.com/modules/passport/signin.ashx?url=" . uri_escape($c->req->uri));
- }
- }
- return 1;
- }
复制代码
你一定奇怪为什么不用SOAP::Lite的service函数,因为我用了,调用.net的web service,老是报错,没办法,就像上边制定uri和proxy来用了,uri对应.net 的 web service 描述 那边有个命名空间的东西。
上边的用法也是MSDN里边的用法。perl调用.net的web service是麻烦点。
[ 本帖最后由 bulletming 于 2008-9-11 12:50 编辑 ] |
|