SOAP-ERROR: WSDL 구문 분석: 로드할 수 없지만 WAMP에서 작동합니다.
이것은 내 WAMP 서버에서는 잘 작동하지만 Linux 마스터 서버에서는 작동하지 않습니다!?
try{
$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true]);
$result = $client->checkVat([
'countryCode' => 'DK',
'vatNumber' => '47458714'
]);
print_r($result);
}
catch(Exception $e){
echo $e->getMessage();
}
내가 여기서 놓치고 있는 것은 무엇입니까?! :(
SOAP 사용
오류
SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl' : failed to load external entity "http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl"/taxation_customs/vies/checkVatService.wsdl"
PHP에서 URL 호출
PHP에서 URL을 호출하면 오류가 반환됩니다.
$wsdl = file_get_contents('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl');
echo $wsdl;
오류
Warning: file_get_contents(http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl): failed to open stream: HTTP request failed! HTTP/1.0 503 Service Unavailable
명령줄에서 URL 호출
에서 URL 하기 스눅에 URL 출HTTP 200
X와 됩니다.ML 응답과 함께 반환됩니다.
curl http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
일부 버전의 php에서는 SoapClient가 http 사용자 에이전트 정보를 보내지 않습니다.서버에 로컬 WAMP와 비교하여 어떤 php 버전이 있습니까?
다음과 같은 컨텍스트 스트림을 사용하여 사용자 에이전트를 명시적으로 설정합니다.
try {
$opts = array(
'http' => array(
'user_agent' => 'PHPSoapClient'
)
);
$context = stream_context_create($opts);
$wsdlUrl = 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl';
$soapClientOptions = array(
'stream_context' => $context,
'cache_wsdl' => WSDL_CACHE_NONE
);
$client = new SoapClient($wsdlUrl, $soapClientOptions);
$checkVatParameters = array(
'countryCode' => 'DK',
'vatNumber' => '47458714'
);
$result = $client->checkVat($checkVatParameters);
print_r($result);
}
catch(Exception $e) {
echo $e->getMessage();
}
편집
실제로 사용 중인 웹 서비스에 문제가 있는 것 같습니다.HTTP over IPv6와 누락된 HTTP User Agent 문자열의 조합으로 인해 웹 서비스 문제가 발생하는 것 같습니다.
이를 확인하려면 Linux 호스트에서 다음을 시도하십시오.
curl -A '' -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
이 IPv6 요청이 실패합니다.
curl -A 'cURL User Agent' -6 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
이 IPv6 요청이 성공했습니다.
curl -A '' -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
curl -A 'cURL User Agent' -4 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl
이러한 IPv4 요청이 모두 성공했습니다.
흥미로운 사례:) Linux 호스트가 ec.europa.eu 를 IPv6 주소로 해결하고 SoapClient 버전이 기본적으로 사용자 에이전트 문자열을 추가하지 않은 것 같습니다.
보안 문제:이 답변은 보안 기능을 비활성화하므로 프로덕션에서 사용하면 안 됩니다!
이거 먹어봐요.도움이 되길 바랍니다.
$options = [
'cache_wsdl' => WSDL_CACHE_NONE,
'trace' => 1,
'stream_context' => stream_context_create(
[
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
'allow_self_signed' => true
]
]
)
];
$client = new SoapClient($url, $options);
이 문제는 libxml 엔티티 로더를 사용하지 않도록 설정했기 때문에 발생할 수 있습니다.
달기보를 실행해 .libxml_disable_entity_loader(false);
예를들전에를 예로 들기 에.SoapClient
.
이 질문에 대한 정확한 대답은 없지만 누군가에게 도움이 될 수 있습니다.
soapurl에 비표준 포트(예: 9087)가 있으며 방화벽이 해당 요청을 차단하여 다음 오류가 발생할 때마다 작업을 수행했습니다.
오류 - 2017-12-19 20:44:11 --> 치명적 오류 - SOAP-ERROR: 구문 분석 WSDL: 'http://soalurl.test:9087/orawsv?wsdl'에서 로드할 수 없음: 외부 엔티티 "http://soalurl.test:9087/orawsv?wsdl"을 로드하지 못했습니다.
방화벽에서 포트를 허용하고 오류를 해결했습니다!
변경 시도
$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true]);
로.
$client = new SoapClient('http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', ['trace' => true, 'cache_wsdl' => WSDL_CACHE_MEMORY]);
안 먹히든), 그리고 '아니다'를 합니다./tmp
웹 서버에서 쓸 수 있으며 가득 차지 않았습니다.
php.ini에서 openssl 확장이 비활성화된 경우 활성화해 보십시오.이렇게 하면 추가 인수 없이 웹 서비스에 액세스할 수 있습니다.
$client = new SoapClient(url);
위의 어떤 것도 제게 맞지 않아서 많은 연구 끝에 wsdl 파일을 사전 다운로드하여 로컬로 저장하고 해당 파일을 첫 번째 매개 변수로 SoapClient에 전달했습니다.
언급할 가치가 있는 것은 file_get_contents($serviceUrl)가 브라우저에서 URL이 정상적으로 열리는 동안 빈 응답을 반환했다는 것입니다.그래서 SoapClient도 wsdl 문서를 로드할 수 없었을 것입니다.그래서 결국 php curl 라이브러리로 다운받았습니다.여기 예가 있습니다.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $serviceUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$wsdl = curl_exec($ch);
curl_close($ch);
$wsdlFile = '/tmp/service.wsdl';
file_put_contents($wsdlFile, $wsdl);
$client = new SoapClient($wsdlFile);
물론 wsdl 파일에 대한 자체 캐싱 정책을 구현할 수 있으므로 각 요청에 다운로드되지 않습니다.
503은 기능이 작동 중이고 원격 서버에서 사용자를 거부하는 응답을 수신한다는 의미입니다.구글 결과를 cURL하려고 해도 file_get_contents 및 cURL에서 사용하는 사용자 에이전트를 탐지할 수 있기 때문에 동일한 결과가 발생합니다.또한 액세스하는 서버의 IP 주소가 블랙볼링된 상태일 수도 있습니다.
원격 상황의 브라우저처럼 명령이 작동하지 않는 세 가지 일반적인 이유입니다.
기본 USER-AGENT가 차단되었습니다.서버의 IP 블록이 차단되었습니다.원격 호스트에 프록시 탐지가 있습니다.
몇 시간 동안 수많은 로그와 인터넷을 분석한 결과 마침내 문제가 발견되었습니다.
도커와 php 7.4(내 경우)를 사용하는 경우 아마도 OpenSSL의 기본 보안 수준이 wsdl 인증서에 비해 너무 높기 때문에 오류가 발생할 수 있습니다.확인을 비활성화하고 SoapClient 옵션에서 자체 서명을 허용하는 경우에도 마찬가지입니다.
다음에서 더 낮은 sec 레벨이 필요합니다./etc/ssl/openssl.cnf
DEFAULT@SECLEVEL=2
DEFAULT@SECLEVEL=1
또는 도커 파일에 추가하기만 하면 됩니다.
RUN sed -i "s|DEFAULT@SECLEVEL=2|DEFAULT@SECLEVEL=1|g" /etc/ssl/openssl.cnf
출처: https://github.com/dotnet/runtime/issues/30667#issuecomment-566482876
컨테이너에서 실행하여 확인할 수 있습니다.
curl -A 'cURL User Agent' -4 https://ewus.nfz.gov.pl/ws-broker-server-ewus/services/Auth?wsdl
변경하기 전에 오류가 발생했습니다.
SSL routines:tls_process_ske_dhe:dh key too small
이 문제는 다음과 같이 해결되었습니다.
"호스트"를 제공하는 모든 회사에는 방화벽이 있습니다.
이 오류는 해당 방화벽에 원본 IP가 정의되지 않은 경우에 발생합니다.서버 관리자에게 문의하여 IP를 추가합니다.
또는 서버 방화벽 화이트리스트에 대상 IP를 정의해야 합니다.
아래의 해결책이 저에게 효과가 있었습니다.
- 1로 - 이동php.ini
is is unbuntu에서/etc/php/7.4/apache2
( 참고: 당신은 당신의 php 버전을 사용해야 합니다.7.4
)
2 - 제거;
이 방면에서;extension=openssl
언급하지 않기 위해.
3 - 웹 서버를 다시 시작합니다.sudo service apache2 restart
저는 AdWords API를 사용하는데 가끔 같은 문제가 발생합니다.제 솔루션은 파일 공급업체\googleads\googleads-php-lib\src\Google\AdsApi\AdsSoapClient.php line 65에서 ini_set('default_socket_timeout', 900)을 추가하는 것입니다.
벤더\googleads-php-lib\src\Google\AdsApi\Adwords\Report\v20702\ReportDownloader에서 다운로드할 수 있습니다.php line 126 ini_set('default_socket_timeout', 900); $requestOptions['stream_context']['filen']['filen'] = "900";
Google 패키지는 기본 php.ini 매개 변수를 덮어씁니다.
때때로 페이지가 'https://adwords.google.com/ap i/adwords/mcm/v20702/ManagedCustomerService?'에 연결될 수 있습니다.wsdl 그리고 때때로 아니오.페이지가 한 번 연결되면 WSDL 캐시에 동일한 페이지가 포함되며 코드가 캐시를 새로 고칠 때까지 프로그램이 정상입니다...
추가 중?wsdl
마지막에 메서드를 호출합니다.
$client->__setLocation('url?wsdl');
나에게 도움이 되었습니다.
나는 이틀 동안 이것에 대한 모든 질문을 읽었을지도 모릅니다.어떤 대답도 제게는 통하지 않았습니다.
저의 경우 PHP용 cURL 모듈이 부족했습니다.
터미널에서 cURL을 사용할 수 있다고 해서 PHP cURL 모듈이 있고 활성화되어 있는 것은 아닙니다.그것에 대해 표시하는 데 오류가 없었습니다.에도./var/log/apache2/error.log
모듈 설치 방법: (해당 버전 번호로 교체)
sudo apt install php7.2-curl
sudo service apache2 reload
저도 같은 문제가 있었습니다.
로컬 머신에서는 모든 것이 작동하지만(wamp + php 5.5.38 또는 vagrant + php 7.4) prod linux 서버에서는 오류가 발생했습니다.
SOAP-ERROR: Parsing WSDL: Couldn't load from 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl' : failed to load external entity "http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl"
크롬의 리디렉션 경로 플러그인에서 https로 영구 리디렉션을 찾았지만 url을 https로 변경해도 도움이 되지 않습니다.
Status Code URL IP Page Type Redirect Type Redirect URL
301 http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl 147.67.210.30 server_https permanent https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl 200 https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl 147.67.210.30 정상 없음
서로 다른 코드 솔루션을 몇 번 시도한 후 서버 공급자에게 도움이 되었습니다.그는 ipv6에서 IP 포워딩 문제를 발견했습니다.
http://ec.europa.eu/
Pinging ec.europa.eu [147.67.34.30] with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
권장 사항은 소켓을 사용하여 사용자 stream_context_create를 생성하고 0:0으로 바인딩하는 것입니다.이것은 ipv4를 강제합니다.
// https://www.php.net/manual/en/context.socket.php
$streamContextOptions = [
'socket' => [
'bindto' => '0:0'
],
];
$streamContext = stream_context_create($streamContextOptions);
$soapOptions = [
'stream_context' => $streamContext
];
$service = new SoapClient('https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl', $soapOptions);
실수로 속성을 제거했기 때문에 비슷한 오류가 발생했습니다.[ServiceContract]
내 계약에서, 그러나 서비스 호스트는 여전히 성공적으로 열리고 있었습니다..
엔드포인트가 다음을 지원하는지 확인할 수 있습니다.https
뿐만 아니라.
언급URL : https://stackoverflow.com/questions/21861077/soap-error-parsing-wsdl-couldnt-load-from-but-works-on-wamp
'programing' 카테고리의 다른 글
lstat fstat과 stat의 차이(C) (0) | 2023.08.12 |
---|---|
Jquery .show() 숨김 표시가 있는 div를 표시하지 않음 (0) | 2023.08.12 |
데이터 테이블 - 데이터 테이블 외부의 검색 상자 (0) | 2023.08.07 |
앵귤러는 vue.js와 같은 "슬립 속성" 기능을 가지고 있습니까? (0) | 2023.08.07 |
C 확장:C 확장:연산자들연산자들 (0) | 2023.08.07 |