2008-11-09 2 views
1

Я создал службу WCF .NET, которая всегда должна быть над HTTPS. Когда я впервые создал сервисный скелет и запускал его по HTTP, он работал нормально. Я использовал PHP5 для проверки совместимости со встроенными функциями SOAP. Однако, как только я переключился на HTTPS, когда я пытаюсь вызвать функцию из PHP, я возвращаюсь с сообщением «Method Not Allowed» и кодом ошибки «http». Однако это позволяет мне получить список методов. Ошибка возникает при вызове метода «Тест».WCF над HTTPS с PHP-броском исключение «Метод не разрешено»

Вот конфигурация 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 (в зависимости от сценария).

Также - Заметим, что вам не хватает behaviorConfiguration="apiBehavior" на элементе <service....

+0

Я посмотрел на Fiddler, но, будучи тем, что все зашифровано, похоже, это мало помогает, если я что-то не упускаю. И прошу прощения у атрибута поведения. У меня было это там, и я удалил его, прежде чем копировать/вставлять в мое стремление попытаться выяснить проблему. – Shane

+0

Ну, Fiddler может декодировать ssl. но только если сеанс начинается в IE. Проваливается ли он через http? Возможно, проблема воспроизводима без https (так как я не видел TransportWithMessageCredential), и в этом случае проверка легко. –