web-dev-qa-db-fra.com

IIS Service WCF hébergé renvoie une requête incorrecte HTTP 400

Je cherchais depuis des heures mais je ne trouvais pas la solution. Je vais expliquer brièvement.

J'apprends les services de la WCF. Je viens de créer un service et de le parcourir. Voici le fichier de configuration:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="EmployeeServiceBehaviour">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="EmployeeServiceBehaviour" name="EmployeeConfiguration">
        <endpoint address="http://localhost:2005/EmployeeService.svc" binding="basicHttpBinding"
          bindingConfiguration="" contract="IEmployeeConfiguration" />
      </service>
    </services>
  </system.serviceModel>
  <system.web>
    <compilation debug="true"/>
  </system.web>
  <system.webServer>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

Lorsque vous naviguez dans Visual Studio, il ne semble pas y avoir de problème. Ça fonctionne parfaitement.

enter image description here

enter image description here

Deuxièmement, j'essaie de le publier sur IIS. Ce que je fais est ceci:

Je publie le service dans un dossier et ajoute ce service à IIS.

enter image description here

Je sélectionne le port 3006 comme port.

Ci-dessous son fichier de configuration. Notez que j'ai aussi changé le port dans config en 3006

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="EmployeeServiceBehaviour">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="EmployeeServiceBehaviour" name="EmployeeConfiguration">
        <endpoint address="http://localhost:3006/EmployeeService.svc" binding="basicHttpBinding"
          bindingConfiguration="" contract="IEmployeeConfiguration" />
      </service>
    </services>
  </system.serviceModel>
  <system.web>
    <compilation/>
  </system.web>
  <system.webServer>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

Et j'attends de courir sans heurts mais: enter image description here

enter image description here

IIS me donne une page blanche de Chrome

enter image description here

Et HTTP 400 Bad Request de l'Explorateur

enter image description here

Enfin, si je supprime une partie de l'adresse du fichier de configuration, tout fonctionne bien. Mais une autre chose confuse est que, sur mon autre ordinateur après le scénario ci-dessus (adresse fournie), je peux accéder au service. Donc, je suis vraiment fatigué de chercher pourquoi cela fonctionne sur un ordinateur et non sur un autre. Quelqu'un pourrait-il me l'expliquer?

Je sais que c'est un peu plus long, mais je dois l'expliquer clairement. Merci

11
Omer K

D'après mes recherches, je ne devrais pas fournir d'adresse. 

msdn.Microsoft.com/en-us/library/aa751792(v=vs.110).aspx

Vous devez toujours utiliser des adresses de points de terminaison relatives pour les points de terminaison du service hébergé par IIS . La fourniture d'une adresse de noeud final entièrement qualifiée (par exemple, Localhost/MyService.svc) peut entraîner des erreurs dans le déploiement du service Si l'adresse du noeud final ne pointe pas vers l'application IIS qui héberge le service exposant le noeud final. L'utilisation d'adresses Relatives aux points d'extrémité relatifs pour les services hébergés évite ces conflits potentiels.

6
Omer K

Cela peut être utile. Je viens de passer plus de 2 heures à essayer de faire fonctionner cela. J'utilise FF et son ensemble comme navigateur par défaut.

en FF, il ajoutait un/à la fin de mon URL

http://services.tester.dev/VehicleFeedService.svc/

qui a retourné un NetworkError: 400 Bad Request 

cependant, en IE ou chrome, il ne met pas le/à la fin et cela fonctionne bien.

une chose à noter .. même dans FF qui me donnait une demande de 400 mauvaises, le ?wdsl a fonctionné

http://services.tester.dev/VehicleFeedService.svc?wsdl

il semble que le/était à l'origine du problème

1
JGilmartin

Je pense que cela résoudra votre problème:

Ajoutez ce point final à votre service: 

<endpoint address="mex" binding="mexHttpBinding" 
    bindingConfiguration="" contract="IMetadataExchange" />

Et remplacez l'attribut name de la service par le nom complet de votre classe de service: 

<service behaviorConfiguration="EmployeeServiceBehaviour" 
    name="Namespace.EmployeeConfigurationClass">

J'espère que ça suffit

1
Alireza

Vous pouvez essayer fiddler et le svcTracer qui peut vous donner beaucoup d’informations de débogage. Vous pouvez également utiliser le drapeau includeExceptionDetailInFaults=true sur le serveur, mais il est important de signaler que vous n’avez pas toujours le droit d’envoyer ces informations au client si le client est une entité externe. Avec cet avertissement, voici comment l'utiliser.

<serviceBehaviors>
    <behavior name="ServiceBehavior">
    ....
        <serviceDebug includeExceptionDetailInFaults="true" />
    ....
    </behavior>
</serviceBehaviors>

Bon débogage :)

0
Mubashar Ahmad