我有一个带签名的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。
为什么我的输入没有在服务器端正确序列化?
答案 0 :(得分:1)
这是工作代码。感谢elgonzo。
有两件事与我以前的代码不同。
将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();
}