Asp.net mvc 接受MVC API中的字节数组参数作为Base64

Asp.net mvc 接受MVC API中的字节数组参数作为Base64,asp.net-mvc,model-view-controller,asp.net-web-api,asp.net-mvc-5,base64,Asp.net Mvc,Model View Controller,Asp.net Web Api,Asp.net Mvc 5,Base64,我目前正在构建一个ASP.NET MVC WebAPI服务,我希望在querystring中发送一小段二进制数据。此应用程序中的方法通过POST调用,主体包含实际数据。querystring用于描述正文中数据的某些属性(例如,数据的编码方式) 我想知道是否可以接受字节数组参数作为查询字符串中的base64编码字符串 例如,我有以下代码: using System.Text; using System.Web.Http; namespace WebApplication2.Controllers

我目前正在构建一个ASP.NET MVC WebAPI服务,我希望在querystring中发送一小段二进制数据。此应用程序中的方法通过POST调用,主体包含实际数据。querystring用于描述正文中数据的某些属性(例如,数据的编码方式)

我想知道是否可以接受字节数组参数作为查询字符串中的base64编码字符串

例如,我有以下代码:

using System.Text;
using System.Web.Http;

namespace WebApplication2.Controllers
{
    public class ByteArrayController : ApiController
    {
        public string Get([FromUri] byte[] myarray)
        {
            var strbResult = new StringBuilder();
            foreach (byte byteValue in myarray)
            {
                strbResult.AppendLine(byteValue.ToString() + " ");
            }
            return strbResult.ToString();
        }
    }
}
然后,我希望能够通过以下方式发送参数myarray:

请不要介意命名,这只是一个简单的例子

现在我知道可以在querystring中多次使用同一参数发送数组(例如myarray=1&myarray=2&myarray=3),但我希望将其作为base64编码字符串接受

我一直在寻找一个属性来指定如何解码数组,但找不到这样的属性


当然,我可以修改代码以接受字符串,然后将其转换为字节数组,但如果可能的话,我更喜欢透明地执行此操作

最后,我找到了一篇关于模型绑定器的有趣文章,它使我能够实现上述功能:

对于我的解决方案,我为“基本64字节数组”创建了一个模型绑定器:

using System;
using System.Web.Http.ModelBinding;
using System.Web.Http.ValueProviders;

namespace WebApplication2.Models
{
    /// <summary>
    /// Model binder for byte-arrays that are sent as base 64 strings. 
    /// </summary>
    public class ModelBinderWithBase64Arrays : IModelBinder
    {
        public bool BindModel(System.Web.Http.Controllers.HttpActionContext actionContext, ModelBindingContext bindingContext)
        {
            if (bindingContext.ModelType == typeof(byte[]))
            {
                ValueProviderResult val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
                string valueAsString = val.RawValue as string;
                try
                {
                    bindingContext.Model = Convert.FromBase64String(valueAsString);
                    return true;
                }
                catch
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
    }
}
最后,我修改了action方法,通过添加[ModelBinder]属性(您还可以使用该属性设置特定的模型绑定器),使其对byte[]参数使用此默认模型绑定器:

现在我可以使用Base64编码的值,它作为字节数组接收

尽管此解决方案确实需要添加[ModelBinder]属性,但它确实允许自由使用模型绑定器的位置,并且仍然提供尽可能多的透明度

当然,同样的解决方案也可以用于其他数据,如自定义日期值等

// Register model binder for base 64 encoded byte arrays
var provider = new SimpleModelBinderProvider(typeof(byte[]), new ModelBinderWithBase64Arrays());
config.Services.Insert(typeof(ModelBinderProvider), 0, provider);
public string Get([ModelBinder] byte[] myarray)