Я создал службу 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 требует доверенного сертификата.
Что я делаю неправильно?
Я посмотрел на Fiddler, но, будучи тем, что все зашифровано, похоже, это мало помогает, если я что-то не упускаю. И прошу прощения у атрибута поведения. У меня было это там, и я удалил его, прежде чем копировать/вставлять в мое стремление попытаться выяснить проблему. – Shane
Ну, Fiddler может декодировать ssl. но только если сеанс начинается в IE. Проваливается ли он через http? Возможно, проблема воспроизводима без https (так как я не видел TransportWithMessageCredential), и в этом случае проверка легко. –