1

json としてフォーマットされた文字列を wcf restful サービスに渡す際に問題に直面しています。

Http400 エラーが発生します。何が悪いのかわからない。

これが私のコードです

IService.cs

[OperationContract]
    [WebInvoke(
        Method = "GET",
        UriTemplate = "savesomething/{u}",
        BodyStyle = WebMessageBodyStyle.WrappedRequest,
        ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json)]
    string SaveSomething(string u);

    [DataContract]
    public class UserAccount
    {
        [DataMember(Name = "userid")]
        public string UserId
        {
            get;
            set;
        }

        [DataMember(Name = "password")]
        public string Password
        {
            get;
            set;
        }
    }

Service1.cs

public string SaveSomething(string u)
    {
        UserAccount ua = Deserialize<UserAccount>(u);
        StringBuilder sb = new StringBuilder(string.Empty);
        sb.Append(string.Format("UserID : {0}\r\n", ua.UserId));
        sb.Append(string.Format("Password : {0}\r\n", ua.Password));
        File.WriteAllText(@"D:\\temp\data.txt", sb.ToString());
        return "completed!";
    }

    private static UserAccount Deserialize<UserAccount>(string json)
    {
        UserAccount obj = Activator.CreateInstance<UserAccount>();
        MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
        DataContractSerializer serializer = new DataContractSerializer(obj.GetType());
        obj = (UserAccount)serializer.ReadObject(ms);
        ms.Close();
        return obj;
    }

クライアントの default.cs

protected void Page_Load(object sender, EventArgs e)
{
    string serviceUrl = "http://localhost:65085/Service1.svc/savesomething";

    MyUser mu = new MyUser();
    mu.UserId = "bob";
    mu.Password = "bobbypassword";
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(serviceUrl);
    request.Method = "POST";
    request.ContentType = "application/json; charset:utf-8";
    DataContractJsonSerializer seria = new DataContractJsonSerializer(mu.GetType());
    MemoryStream ms = new MemoryStream();
    seria.WriteObject(ms, mu);
    String js = Encoding.UTF8.GetString(ms.ToArray());
    StreamWriter write = new StreamWriter(request.GetRequestStream());
    write.Write(js);
    write.Close();
    HttpWebResponse resp = request.GetResponse() as HttpWebResponse;
    StreamReader stReader = new StreamReader(resp.GetResponseStream());
    string jsonStr = stReader.ReadToEnd();
    resp.Close();
    Response.Write(jsonStr + "<BR>");
}

クライアントの MyUser.cs

public class MyUser
{
    public MyUser(){}
    public string UserId { get; set; }
    public string Password { get; set; }
}
4

1 に答える 1

1

2 つの問題があります。

  • リクエストの Content-Length を設定していません - Web サーバーはおそらく HTTP 400 でリクエストを拒否します
  • リクエストに Content-Length を設定しても、サービスはそれを処理できません。最初uに UriTemplate から削除します。データを投稿していますが、これらのデータは uri ではなくメッセージの本文にあります。stringtoの次のメソッド パラメーターでUserAccount、WCF に自動的に逆シリアル化を実行させます。
于 2012-04-23T10:51:44.680 に答える