我有一个Controller类(在C#
中),它必须从其login方法返回一个字节数组。请在我的登录功能中找到我的Controller类的以下源代码。
[RoutePrefix("Account")]
public class AccountsController : ApiController
{
[Route("Login")]
[HttpPost]
public byte[] Login()
{
byte[] mSessionID = new Session().getmSessionID();
return mSessionID;
}
}
在测试时,Web服务将base64Encoded字符串值返回为“LVpgqWBYkyXX1FlDg95vlA==
”。我希望我的Web服务返回一个字节数组响应(在JSON响应中)。
答案 0 :(得分:1)
如果您想以这种格式获得回复:
{
"Numbers": [
2,
3,
4,
5,
6,
7,
8,
9,
10,
1,
11,
12,
13,
14,
15,
2,
45
]
}
解决方案1:JSON格式化程序
您需要修改JSON序列化的方式。 WebAPI使用JSON.Net unser引擎将WebAPI响应格式化为JSON。我们可以覆盖byte [] formatter,如下所示:
创建自定义格式化程序
public class ByteArrayFormatter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(byte[]);
}
public override bool CanRead
{
get
{
return false;
}
}
public override bool CanWrite
{
get
{
return true;
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var byteArray = (byte[])value;
writer.WriteStartArray();
if (byteArray != null && byteArray.Length > 0)
{
foreach (var b in byteArray)
{
writer.WriteValue(b);
}
}
writer.WriteEndArray();
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
在Application_Start
的{{1}}方法中全局注册格式化程序(请注意,所有Global.asax.cs
类型都将以这种方式序列化):
byte[]
创建一个模型,以便您的JSON响应具有var formatters = GlobalConfiguration.Configuration.Formatters;
var jsonFormatter = formatters.JsonFormatter;
jsonFormatter.SerializerSettings.Converters.Add(new ByteArrayFormatter());
属性:
Numbers
修改您的控制器以使用此模型:
public class NumbersModelByte
{
public byte[] Numbers { get; set; }
}
解决方案2:快速而肮脏
您需要返回一个对象(模型)。
NumbersModelInt.cs(注意int []类型)
[Route("login")]
[System.Web.Http.AcceptVerbs("GET")]
[System.Web.Http.HttpGet]
public NumbersModelByte Login()
{
byte[] mSessionID = new Session().getmSessionID();
return new NumbersModelByte
{
Numbers = mSessionID
};
}
然后,您需要将字节数组中的所有字节转换为响应中的整数:
public class NumbersModelInt
{
public int[] Numbers { get; set; }
}
答案 1 :(得分:0)
回答我的第二个问题。 (将JSON对象传递给Controller的方法)
我得到了同事的帮助,她找到了一个合适的链接。
我为修复此问题所做的代码更改
公共异步任务登录() { string input = await Request.Content.ReadAsStringAsync(); dynamic data = Newtonsoft.Json.Linq.JObject.Parse(input); }
(输入 - 以JSON格式返回为字符串) (data - 返回JSON对象)