2008-11-09 2 views
1

항상 HTTPS를 초과하는 .NET WCF 서비스를 만들었습니다. 처음 서비스 골격을 만들고 HTTP를 통해 실행했을 때 제대로 작동했습니다. PHP5를 사용하여 SOAP 기능에 내장 된 상호 운용성을 테스트했습니다. 그러나 일단 HTTPS로 전환하면 PHP에서 함수를 호출하려고 할 때 "Method Not Allowed"라는 메시지와 "http"오류 코드로 오류가 발생합니다. 그것은 나를 통해 메서드 목록을 검색 할 수 있습니다. "테스트"메서드를 호출 할 때 오류가 발생합니다. 여기 HTTPS를 통한 WCF와 PHP의 "Method Not Allowed"예외 발생

는 WCF 구성입니다 :

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="secureBasic"> 
      <security mode="Transport"> 
      <transport clientCredentialType="None" /> 
      </security> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="apiBehavior" name="TestAPI.API"> 
     <endpoint address="https://192.168.0.3/API" 
        binding="basicHttpBinding" 
        bindingConfiguration="secureBasic" 
        contract="TestAPI.IAPI"/> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="apiBehavior"> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

그리고 여기에 PHP가 그것을 호출하는 방법입니다

$client = new SoapClient("https://192.168.0.3/API.svc?wsdl"); 
echo "<pre>" . print_r($client->__getFunctions(), 1) . "</pre>"; 
$param = new stdClass(); 
$param->A = "123"; 
$param->B = "456"; 
try { 
    $client->Test($param); 
} catch (Exception $e) { 
    die("<pre>" . print_r($e,1) . "</pre>"); 
} 

내가 테스트를위한 자체 서명 된 SSL 인증서를 사용하고 있는데 난 몰라 PHP는 신뢰할 수있는 인증서가 필요합니다.

내가 뭘 잘못하고 있니?

답변

1

네트워크 스니퍼를 사용해 실제로 요청한 곳을 확인한 적이 있습니까? Fiddler 또는 Wireshark와 같은 것 (시나리오에 따라 다름).

또한 - 난 당신이 <service... 요소에 behaviorConfiguration="apiBehavior" 누락 있습니다.

+0

내가 피들러을 검토 한 결과,하지만 모두 암호화되어있는, 내가 뭔가를 놓친 거지 많이하지 않는 데 도움이하지 않는 것 같습니다. 그리고 behaviorConfiguration 속성이 누락되어 사과드립니다. 문제를 파악하기 위해 복사/붙여 넣기를하기 전에 그것을 거기에 넣었습니다. – Shane

+0

음, 피들러는 SSL을 디코딩 할 수있다. 하지만 경우에만 세션은 IE에서 시작됩니다. 그것은 http를 통해 실패합니까? 하는 경우 검사가 쉽고, (내가 어떤 TransportWithMessageCredential이 표시되지 않았으므로)이 문제가 HTTPS없이 재현이라고 할 수 있습니다. –