2011-05-10 3 views
1

J'ai un service WCF hébergé sous IIS, derrière un équilibreur de charge. SSL est déchargé sur le LB, puis le service est appelé en HTTP simple.Point de terminaison SOAP via HTTPS renvoie 400 Demande incorrecte

J'ai réussi à faire fonctionner le point de terminaison REST du service, mais je n'arrive pas à faire en sorte que le point de terminaison SOAP affiche la page wsdl. Lors de l'appel https://domain/Service.svc/soap?wsdl, le navigateur reçoit une réponse 400 Bar Request. J'ai aussi inspecté le svclog et l'erreur est There is a problem with the XML that was received from the network. See inner exception for more details. ce qui signifie qu'il m'attendait à faire un POST au lieu de GET et d'envoyer un XML au-dessus.

Snippets des configs:

<bindings> 
    <basicHttpBinding> 
     <binding name="basicBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> 
      <security mode="Transport"></security> 
      <readerQuotas maxStringContentLength="2147483647" /> 
     </binding> 
    </basicHttpBinding> 
    <webHttpBinding> 
     <binding name="webBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"> 
      <security mode="Transport"></security> 
     </binding> 
    </webHttpBinding> 
</bindings> 

<services> 
    <service behaviorConfiguration="MyServiceBehavior" name="Namespace.Service"> 
     <endpoint address="" behaviorConfiguration="MyRESTBehavior" binding="webHttpBinding" bindingConfiguration="webBinding" name="REST" contract="Namespace.IService" /> 
     <endpoint address="https://domain/Service.svc/soap" binding="basicHttpBinding" bindingConfiguration="basicBinding" name="SOAP" contract="Namespace.IService" /> 
    </service> 
</services> 

<behaviors> 
    <serviceBehaviors> 
     <behavior name="MyServiceBehavior"> 
      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
      <dataContractSerializer maxItemsInObjectGraph="6553600" /> 
     </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
     <behavior name="MyRESTBehavior"> 
      <webHttp/> 
     </behavior> 
    </endpointBehaviors> 
</behaviors> 

J'ai essayé d'utiliser wsHttpBinding aussi, mais le seul résultat différent devenais 401 s à la place. Toutes les directions ont apprécié.

Répondre

0

Je l'ai trouvé. J'avais précédemment enlevé l'attribut httpsGetUrl du serviceMetadata parce que je recevais une erreur à propos de la publication d'un service deux fois. Je pense maintenant que cette erreur était probablement due à une faute de frappe et je n'aurais pas dû supprimer le httpsGetUrl. Changer la section behaviors à celui ci-dessous a résolu mon problème:

<behaviors> 
    <serviceBehaviors> 
     <behavior name="MyServiceBehavior"> 
      <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" httpsGetUrl="https://domain/Service.svc/soap" /> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
      <dataContractSerializer maxItemsInObjectGraph="6553600" /> 
     </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
     <behavior name="MyRESTBehavior"> 
      <webHttp/> 
     </behavior> 
    </endpointBehaviors> 
</behaviors> 
+0

cela ne fonctionne pas pour moi ... –

0

Je ne crois pas que vous pouvez utiliser une adresse absolue pour le point de terminaison basicHttpBinding. Essayez ceci:

<endpoint address="soap" binding="basicHttpBinding" bindingConfiguration=... 

Pour accéder au WSDL votre URL devrait ressembler à ceci: "https: //domain/soap/Service.svc wsdl". Avec IIS & WCF, vous ne pouvez pas remplacer l'URL du répertoire virtuel. La valeur de l'adresse de point de terminaison doit être relative à l'URL du site Web.

Questions connexes