2009-08-24 5 views
0

Ich habe einen WCF-Service eingerichtet. Leider, wenn ich den Service über Fiddler, das Web oder wo auch immer anrufe, bekomme ich einen http 400 Fehler. Ich bin wirklich verblüfft darüber, wo ich anfangen soll, dieses Problem zu lösen. Irgendwelche Vorschläge werden geschätzt. WSDL ist derzeit keine Option. REST ist eine Voraussetzung. Ich war in der Lage, Anrufe zuvor mit GET zu tätigen, jedoch ist es nicht sicher, da ich die Benutzer-ID und das Passwort zur Validierung übergeben muss und das leicht zu sehen wäre.Get ein http 400 Fehler beim Aufruf eines erholsamen WCF-Service mit http Post

Der Wcf-Dienst hat folgende Schnittstelle:

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

Der Dienst hat den folgenden Code ein. Ja, dieser Code ist unvollständig und ich weiß, dass AppKey wirklich nichts macht, da es als Platzhalter an dieser Stelle steht.

public bool Login(string UserName, string PassWord, string AppKey) 
    { 
     bool bl = false; 
     if (String.IsNullOrEmpty(AppKey)) 
     { 
      throw (new ApplicationException(AppKeyNull)); 
     } 
     if (Membership.ValidateUser(UserName, PassWord)) 
     { 
      bl = true; 
     } 
     return (bl); 
    } 

Ich versuche, den Dienst über Fiddler aufrufen. Ich habe die folgende URL:

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

Ich habe folgenden Header-Setup:

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

Ich habe folgenden Körperaufbau:

UserName=xxxxxx&PassWord=yyyyyy&AppKey=blah 

Antwort

0

A 400 Fehler könnten passieren, wenn Content-Length ist ein bisschen ab, wenn Sie es aus irgendeinem Grund selbst berechnen. Benötigt möglicherweise mehr Informationen, wie der vollständige Text der http-Anfrage.

+0

Danke für den Vorschlag. Ich habe die Inhaltslänge von Hand berechnet und kam auch auf 46. Ich hatte Fiedler das selbst berechnen lassen. Leider konnte das Problem dadurch nicht behoben werden. –

+0

Danke David. Ich habe das funktioniert. –

0

Ist das ein gültiges Datenformat, das an den REST-Dienst übergeben werden soll?

kann ich nur annehmen, verwenden Sie diese: http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webinvokeattribute.aspx

Und du bist kein RequestFormat Angabe, die XML und JSON unterstützt. Dein Körper ist weder JSON noch XML.

+0

sind json und xml die einzigen unterstützten Formate? Ich dachte, dass sie für komplexe Objekte sind. –

+0

Danke Adam. Ich habe das funktioniert. –

0

Check out WCF REST Contrib für Hilfe mit diesem. Oder Sie können einen Stream-Parameter in Ihrer Implementierungsmethode akzeptieren und das Dienstprogramm HttpUtility.ParseQueryString verwenden, um die Abfragezeichenfolgenwerte aus dem POSTed-Body auszuwerten.

2

Geben Sie diesem einen Versuch:

Ihre Methodensignatur ändern und Attribute zu diesem

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

Dann fügen Sie eine neue Datenvertrag LoginContract

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

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

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

} 

Dann, wenn Sie mit Fiddler Post Content-Type: text/xml angeben

und verwenden Sie dies als Ihre Anfragen t Körper

<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> 

Alternativ, wenn Sie wollten die RequestFormat = WebMessageFormat ändern JSON als Ihr Antrag Körper verwenden.JSON und geben diese in der Abfragekörper

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

Überprüfen Sie, ob "Content-Type" im Request-Header fehlt?

Verwandte Themen