我的邮政操作出了什么问题

时间:2014-05-27 00:01:35

标签: asp.net-web-api2

我有一个带签名的webapi2

[Route("add/usertorole")]
[HttpPost]
public IHttpActionResult AddUserToRole([FromBody] UserRoleRequest request)

我的UserRoleRequst对象看起来像

public class UserRoleRequest
{
    [JsonProperty(PropertyName="UserName")]
    public string UserName { get; set; }
    [JsonProperty(PropertyName = "RoleName")]
    public string RoleName { get; set; }
}

我按以下方式调用此API

UserRoleRequest request = new UserRoleRequest() { UserName = userName, RoleName = roleName };
string reqStr = JsonConvert.SerializeObject(request);
string api = "api/myapi/add/usertorole";
WebRequest req = WebRequest.Create(url);
req.Method = "POST"
req.Credentials = CredentialCache.DefaultCredentials;
req.ContentType = "application/json; charset=utf-8";
byte[] byteArray = new byte[reqStr.Length * sizeof(char)];
Buffer.BlockCopy(reqStr.ToCharArray(), 0, byteArray, 0, byteArray.Length);
req.ContentLength = byteArray.Length;
Stream dataStream = req.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
HttpWebResponse resp = req.GetResponse() as HttpWebResponse;
if (resp.StatusCode == HttpStatusCode.OK)
{
    using (Stream respStream = resp.GetResponseStream())
    {
        StreamReader reader = new StreamReader(respStream, Encoding.UTF8);
         rawData= reader.ReadToEnd();
    }
}
else
{
    Console.WriteLine(string.Format("Status Code: {0}, Status Description: {1}", resp.StatusCode, resp.StatusDescription));
}

Console.WriteLine(rawData);

当我调试此代码时,调用进入我的webapi2方法,但输入参数为NULL。

为什么我的输入没有在服务器端正确序列化?

1 个答案:

答案 0 :(得分:1)

这是工作代码。感谢elgonzo。

有两件事与我以前的代码不同。

  1. charset指定为utf-16
  2. 将json字符串转换为base64,然后转换为bytearray。

        WebRequest req = WebRequest.Create(url);
        req.Method = post ? "POST" : "GET";                     
        req.Credentials = CredentialCache.DefaultCredentials;
        req.ContentType = "application/json; charset=utf-16";
        if (post)
        {
            byte[] byteArray = new byte[data.Length * sizeof(char)];
            Buffer.BlockCopy(data.ToCharArray(), 0, byteArray, 0, byteArray.Length);                
            req.ContentLength = byteArray.Length;
            Stream dataStream = req.GetRequestStream();
            string base64 = Convert.ToBase64String(byteArray);
            byte[] base64Array = Convert.FromBase64String(base64);
            dataStream.Write(base64Array, 0, base64Array.Length - 1);
            dataStream.Close();
        }