HTTP 400 Bad Request lors de l'appel de Service WCF Opération?
Quand je l'appelle http://localhost/TestService.svc/GetColors, je reçois un Http (400) Bad Request. Lorsque je l'exécute dans un violon, je reçois aussi des Mauvaises Demande. Quand j'ai appeler le service par le client test wcf, il fonctionne très bien. Ce qui a pu provoquer cela?
Contrat de Service:
[ServiceContract]
public interface ITestService
{
[OperationContract]
string GetColors();
}
Mise en œuvre de ITestService:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class TestService : ITestService
{
public List<Color> GetColors()
{
List<Color> colors= new List<Color>();
colors.Add(new Color { Name = "Red", Code = "123" });
colors.Add(new Color { Name = "Blue", Code = "323" });
colors.Add(new Color { Name = "Green", Code = "3394" });
return colors;
}
}
Voici mon site web.config:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0"/>
</system.web>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="CustomAuthentication">
<security mode="Message">
<message clientCredentialType="UserName"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>
<services>
<service name="TestService.TestService"
behaviorConfiguration="CustomValidator" >
<endpoint
address=""
binding="wsHttpBinding"
bindingConfiguration="CustomAuthentication"
contract="TestService.ITestService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost/TestService/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="CustomValidator">
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="TestService.CustomUserNameValidator, TestService"/>
<serviceCertificate findValue="Test" storeLocation="LocalMachine"
storeName="My" x509FindType="FindBySubjectName"/>
</serviceCredentials>
<serviceMetadata httpGetEnabled="True"/>
</behavior>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
Quand je l'appelle, je viens d'ouvrir un navigateur et de mettre l'url http://localhost/TestService.svc/GetColors
. Si je le fais par le biais de l'environnement de dev, je vois le Http 400 bad request. Si je le fais par le biais de IIS, je viens de voir une page blanche.
Ici est la InnerException:
<ExceptionString>System.Xml.XmlException: The body of the message cannot be read
because it is empty.</ExceptionString>
Une autre question concernant mon CustomUserNameValidation:
Je suis la mise en œuvre de Validation Personnalisée par le biais de la Méthode de validation de UserNamePasswordValidator, mais quand je l'appelle quelque chose comme GetColors par la wcf client, il n'invoque pas la validation de la méthode. La seule façon que je peux le faire pour Invoquer valider est que si je Valider(user,pass) directement dans GetColors. J'ai pensé qu'il woulld est appelée automatiquement à chaque appel de service si vous l'avez configuré correctement dans le web.config.
- Je mettrai à jour mon post.
Vous devez vous connecter pour publier un commentaire.
Votre contrat de service et le service de la mise en œuvre ne semblent pas correspondre....
Le contrat de service définit une seule
string
être retourné à partir deGetColors()
:Mais la mise en œuvre renvoie une
List<Color>
à la place:Est-il une chance que vous avez changé de service mise en œuvre, et j'ai oublié de mettre à jour le contrat de service??
Aussi: puisque c'est un service SOAP avec un
wsHttpBinding
, vous ne peut pas il suffit d'appeler la méthode à partir d'un navigateur en accédant à son adresse - vous besoin d'utiliser le Client Test WCF (qui fonctionne, comme vous le dites). Et vous ne pouvez tout aussi bien l'appeler de Fiddler, soit vous devez créer manuellement la totalité de l'enveloppe SOAP avec en-tête et le corps et de tout - pas une tâche aisée.Ce que vous pouvez faire est d'aller à
http://localhost/TestService.svc?wsdl
pour vérifier si vous en obtiendrez la bonne WSDL pour le service.Beaucoup de choses peuvent en être la cause. Je vous suggère d'abord activer la WCF de Traçage, il est généralement très utile car il vous donne le côté serveur de la sortie de ce qui se passe réellement. Voici un lien qui devrait vous aider: Comment faire pour activer la WCF de traçage
MODIFIER: Une petite chose à noter, avec WCF: contrairement à la génération automatique d'ole' service web ASMX il ne vous permet pas de parcourir à l'adresse de base avec un navigateur standard. Vous pouvez accéder aux Métadonnées d'adresse (mex), mais pas à la racine. C'est seulement par la conception (la méthode HTTP n'est pas pris en charge je crois).