2009-08-24 5 views
0

J'ai configuré un service wcf. Malheureusement, quand j'appelle le service sur fiddler, le web, ou n'importe où, je reçois une erreur http 400. Je suis vraiment perplexe à l'endroit où commencer à résoudre ce problème. Toutes les suggestions sont appréciées. WSDL n'est pas une option pour le moment. REST est une exigence. J'ai été capable de faire des appels précédemment en utilisant GET, cependant, obtenir n'est pas sécurisé car j'ai besoin de passer l'ID utilisateur et le mot de passe pour valider et cela serait facilement visible.Obtention d'une erreur http 400 lors de l'appel d'un service wcf reposant à l'aide du message http

Le service WCF a l'interface suivante:

[WebInvoke(UriTemplate = "/Login", Method="POST", 
     ResponseFormat = WebMessageFormat.Xml, 
     BodyStyle = WebMessageBodyStyle.Wrapped)] 
    [OperationContract] 
    bool Login(string UserName, string PassWord, string AppKey); 

Le service a le code suivant. oui, ce code est incomplet et je sais que AppKey ne fait vraiment rien, c'est là en tant que placeholder à ce stade. J'essaye d'appeler le service sur le violoneux. Je l'adresse suivante:

http://127.0.0.1:82/WebServices/RemoteAPI.svc/Login 

je la configuration d'en-tête suivant:

User-Agent: Fiddler 
Host: 127.0.0.1:82 
Content-Length: 46 
Content-Type: application/x-www-form-urlencoded 

je la configuration du corps suivant:

UserName=xxxxxx&PassWord=yyyyyy&AppKey=blah 

Répondre

0

Une erreur 400 pourrait se produire si Content-Length est éteint un peu, si vous le calculez vous-même pour une raison quelconque. Peut-être besoin de plus d'informations, comme le texte intégral de la requête http.

+0

Merci pour la suggestion. J'ai calculé la longueur du contenu à la main et est venu avec 46 aussi. J'avais laissé le violoniste le calculer seul. Malheureusement, cela n'a pas résolu le problème. –

+0

Merci David. J'ai eu ce travail. –

0

Est-ce un format de données valide à transmettre au service REST?

Je ne peux supposer que vous utilisez ceci: http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webinvokeattribute.aspx

Et vous n'êtes pas spécifier un RequestFormat, qui prend en charge XML et JSON. Votre corps n'est ni JSON ni XML.

+0

sont json et xml les seuls formats supportés? Je pensais qu'ils sont pour des objets complexes. –

+0

Merci Adam. J'ai eu ce travail. –

0

Consultez WCF REST Contrib pour obtenir de l'aide. Vous pouvez également accepter un paramètre Stream dans votre méthode d'implémentation et utiliser l'utilitaire HttpUtility.ParseQueryString pour analyser les valeurs de chaîne de requête du corps POSTed.

2

pour cette solution:

Changer votre signature de la méthode et attributs de cette

[WebInvoke(UriTemplate = "/Login", Method = "POST", ResponseFormat = WebMessageFormat.Xml, RequestFormat= WebMessageFormat.Xml)] 
[OperationContract] 
bool Login(LoginContract loginInfo); 

Ensuite, ajoutez un nouveau contrat de données LoginContract

[DataContract] 
public class LoginContract 
{ 
    [DataMember] 
    public string UserName { get; set; } 

    [DataMember] 
    public string PassWord { get; set; } 

    [DataMember] 
    public string AppKey { get; set; } 

} 

Ensuite, lorsque vous postez avec Fiddler préciser Content-Type: text/xml

et de l'utiliser comme reques t corps

<LoginContract xmlns="http://schemas.datacontract.org/2004/07/YourAppName" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
<AppKey>blah</AppKey> 
<PassWord>testpwd</PassWord> 
<UserName>test</UserName></LoginContract> 

Sinon, si vous vouliez utiliser JSON comme votre corps de demande changer la RequestFormat = WebMessageFormat.JSON et de transmettre cela à votre demande comme corps

{ "AppKey": "blah", "PassWord": "testpwd", "UserName": "test" } 
0
User-Agent: Fiddler 
Host: localhost:8889 
Content-Length: 113 
**Content-Type: text/xml** 

Vérifiez si « Content-Type » manque dans la tête de demande?

Questions connexes