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

服务1.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

我看到两个问题:

  • 您没有设置请求的 Content-Length - Web 服务器很可能会使用 HTTP 400 拒绝您的请求
  • 即使您为请求设置了 Content-Length,您的服务也将无法处理它,因为它。首先u从您的 UriTemplate 中删除 - 您正在发布数据并且这些数据在消息正文中,而不是在 uri 中。Next 方法参数 from stringtoUserAccount并让 WCF 自动进行反序列化。
于 2012-04-23T10:51:44.680 回答