2008-11-09 8 views
1

J'ai créé un service WCF .NET qui est toujours destiné à être HTTPS. Lorsque j'ai créé le squelette du service pour la première fois et l'ai exécuté sur HTTP, cela a fonctionné correctement. J'ai utilisé PHP5 pour tester l'interopérabilité avec les fonctions SOAP intégrées. Cependant, une fois que je suis passé à HTTPS, lorsque j'essaie d'appeler la fonction depuis PHP, je reçois une erreur avec le message "Méthode non autorisée" et le code d'erreur de "http". Cela me permet de récupérer la liste des méthodes. L'erreur se produit lorsqu'elle appelle la méthode "Test".WCF sur HTTPS avec PHP throws exception "Méthode non autorisée"

Voici la configuration de 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> 

Et voici comment PHP appelle cela:

$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>"); 
} 

J'utilise un certificat SSL auto-signé pour le test et je ne Croire que PHP nécessite un certificat de confiance.

Qu'est-ce que je fais mal?

Répondre

1

Avez-vous essayé un analyseur de réseau pour voir ce qui a été demandé d'où? Quelque chose comme Fiddler ou Wireshark (selon le scénario). En outre - Je note qu'il vous manque behaviorConfiguration="apiBehavior" sur l'élément <service....

+0

J'ai regardé Fiddler, mais étant donné que tout est crypté, ça ne semble pas aider beaucoup à moins que je ne manque quelque chose. Et je m'excuse pour l'attribut behaviorConfiguration manquant. Je l'ai eu là et l'ai enlevé avant de copier/coller dans ma poursuite d'essayer de comprendre le problème. – Shane

+0

Eh bien, Fiddler peut décoder ssl. mais seulement si la session commence dans IE. Est-ce qu'il échoue sur http? Il se peut que le problème soit reproductible sans https (puisque je n'ai vu aucun TransportWithMessageCredential), auquel cas l'inspection est facile. –

Questions connexes