programing

SOAP-ERROR: WSDL 구문 분석: 로드할 수 없지만 WAMP에서 작동합니다.

stoneblock 2023. 8. 7. 22:19

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.cnfDEFAULT@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