从ASP.NET中的控制器类返回一个byte []数组

时间:2016-08-15 03:46:24

标签: c# arrays json byte

我有一个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响应中)。

2 个答案:

答案 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的方法)

我得到了同事的帮助,她找到了一个合适的链接。

https://weblog.west-wind.com/posts/2013/dec/13/accepting-raw-request-body-content-with-aspnet-web-api ....

我为修复此问题所做的代码更改

公共异步任务登录()         {             string input = await Request.Content.ReadAsStringAsync(); dynamic data = Newtonsoft.Json.Linq.JObject.Parse(input);         }

(输入 - 以JSON格式返回为字符串) (data - 返回JSON对象)