2009-08-24 10 views
0

wcfサービスをセットアップしました。残念ながら、私がフィドラー、ウェブ、またはいつものサービスを呼び出すと、http 400のエラーが発生します。私はこの問題をどこから解決するのか、本当に困惑しています。どんな提案も感謝しています。この時点でWSDLはオプションではありません。 RESTが必要です。以前はGETを使用して電話をかけることができましたが、確認するためにユーザーIDとパスワードを渡す必要があり、簡単に見ることができるため、getは安全ではありません。http投稿を使用して安心なwcfサービスを呼び出す際にhttp 400エラーが発生する

WCFサービスは、以下のインターフェースを有する。

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

サービスは、次のコードを有しています。はい、このコードは不完全で、私はAppKeyが本当に何もしないことを知っています。その時点でプレースホルダとして存在しています。

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); 
    } 

私はフィドラーを超えてサービスを呼び出そうとしています。私は、次のURLを持っている:

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

私は次のヘッダーの設定があります。

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

を、私は、次のボディを設定している:

UserName=xxxxxx&PassWord=yyyyyy&AppKey=blah 

答えて

0

のContent-Length場合は400エラーが発生する可能性があなたが何らかの理由でそれを自分で計算しているのであれば、ちょっとです。 httpリクエストの全文のような、より多くの情報が必要になることがあります。

+0

ありがとうございます。私はコンテンツの長さを手で計算し、46も出てきました。私はそれを自分自身で計算させるようにしました。残念ながら、これは問題を解決しませんでした。 –

+0

Davidに感謝します。私はこれを働かせた。 –

0

これは有効なデータ形式で、RESTサービスに渡されますか?

私はあなたがこれを使用していると仮定することができます http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webinvokeattribute.aspx

そして、あなたはXMLとJSONをサポートRequestFormatを、指定していません。あなたの体はJSONでもXMLでもありません。

+0

はjsonとxmlのみサポートされていますか?私は彼らが複雑な目的のためだと思った。 –

+0

アダムに感謝します。私はこれを働かせた。 –

0

WCF REST Contribを参照してください。または、実装するメソッドでStreamパラメータを受け入れ、HttpUtility.ParseQueryStringユーティリティを使用して、POSTされた本体からクエリ文字列値を解析することもできます。

はあなたがバイオリンで投稿するとき次に Content-Type: text/xmlを指定する次に、新しいデータ契約が

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

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

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

} 

をLoginContract追加するメソッドのシグネチャを変更し、この

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

に属性

2

この試してみて

これをあなたの要求として使用してください

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

また、リクエストボディにJSONを使用する場合は、RequestFormat = WebMessageFormatを変更します。「Content-Typeのは、」要求ヘッダーに欠落している場合はJSONとあなたの要求のボディとして

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

チェックこれを渡しますか?

関連する問題