我有几个在Apache hhtpd中的mod_perl下运行的SOAP :: Lite客户端。 其中一些使用1.1肥皂服务器,其中一些使用1.2服务器。所以,我有这样的代码:SOAP :: Lite - 在mod_perl中使用版本1.1和1.2的客户端
# In client 1:
my $soap1 = SOAP::Lite->soapversion("1.1");
$result1 = $soap1->method1();
# In client 2:
my $soap2 = SOAP::Lite->soapversion("1.2");
$result2 = $soap2->method2();
这个工作在独立客户端,但是当我运行mod_perl下的代码,我似乎得到由蜇soapversion
方法有副作用:
# From SOAP::Lite.pm
sub soapversion {
my $self = shift;
my $version = shift or return $SOAP::Constants::SOAP_VERSION;
($version) = grep {
$SOAP::Constants::SOAP_VERSIONS{$_}->{NS_ENV} eq $version
} keys %SOAP::Constants::SOAP_VERSIONS
unless exists $SOAP::Constants::SOAP_VERSIONS{$version};
die qq!$SOAP::Constants::WRONG_VERSION Supported versions:\[email protected]{[
join "\n", map {" $_ ($SOAP::Constants::SOAP_VERSIONS{$_}->{NS_ENV})"} keys %SOAP::Constants::SOAP_VERSIONS
]}\n!
unless defined($version) && defined(my $def = $SOAP::Constants::SOAP_VERSIONS{$version});
foreach (keys %$def) {
eval "\$SOAP::Constants::$_ = '$SOAP::Constants::SOAP_VERSIONS{$version}->{$_}'";
}
$SOAP::Constants::SOAP_VERSION = $version;
return $self;
}
这是什么,我相信会发生:
基本上,soapversion
呼叫rededefines在$SOAP::Constants
必需的常量。因为这是mod_perl,所以$SOAP::Constants
是全局的,并在每个服务器线程之间共享(我相信,如果我错了,请纠正我)。这导致了竞争条件:大多数情况下,代码行按照上述顺序或多或少地执行。但是,一旦在一段时间(实际上是调用的约2%)的执行顺序是:
Thread1: my $soap1 = SOAP::Lite->soapversion("1.1");
Thread2: my $soap2 = SOAP::Lite->soapversion("1.2");
Thread1: $result1 = $soap1->method1();
Thread2: $result2 = $soap2->method2();
因此,在$soap1->method1()
被调用$SOAP::Constants
集作为适合1.2版本 - 造成数命名空间是错误的,特别是:
xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding"
哪项是错误1.1 - 谁喜欢:
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
如果我能以某种方式使$SOAP::Constants
定位为erverthread或类似的东西,我想事情会好的。但任何解决方案将不胜感激。
不幸的是我无法测试它,但它对我来说看起来不错。 – NoMann