将字符串(json格式)传递给WCF restful并返回字符串(json格式)

将字符串(json格式)传递给WCF restful并返回字符串(json格式),wcf,wcf-rest,Wcf,Wcf Rest,将格式为json的字符串传递给wcf restful服务时遇到了一个问题 它给了我Http400错误。我不知道怎么了 这是我的密码 IService.cs [OperationContract] [WebInvoke( Method = "GET", UriTemplate = "savesomething/{u}", BodyStyle = WebMessageBodyStyle.WrappedRequest, Respo

将格式为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;
    }
我看到两个问题:

  • 您没有设置请求的内容长度-web服务器很可能会使用HTTP 400拒绝您的请求
  • 即使您为请求设置了内容长度,您的服务也将无法处理该请求,因为它已被删除。首先从您的UriTemplate中删除
    u
    ——您正在发布数据,这些数据位于消息体中,而不是uri中。下一个方法参数从
    string
    UserAccount
    ,并让WCF自动进行反序列化
    • 我发现两个问题:

      • 您没有设置请求的内容长度-web服务器很可能会使用HTTP 400拒绝您的请求
      • 即使您为请求设置了内容长度,您的服务也将无法处理该请求,因为它已被删除。首先从您的UriTemplate中删除
        u
        ——您正在发布数据,这些数据位于消息体中,而不是uri中。下一个方法参数从
        string
        UserAccount
        ,并让WCF自动进行反序列化
      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>");
      }
      
      public class MyUser
      {
          public MyUser(){}
          public string UserId { get; set; }
          public string Password { get; set; }
      }