2

我需要我的 Windows Phone 应用程序能够使用 Mango 中提供的 BackgroundTransferService 将音频文件上传到我的 MVC3 站点。

作为一种可能的解决方案,我可以:

  1. 将路由映射到我的控制器:

    public override void RegisterArea(AreaRegistrationContext context)
            {
                context.MapRoute(
                    "SingleAudioFile",
                    "Api/Audio/Recieve",
                    new { controller = "AudioFiles", action = "Recieve" }
                    );
            }
    
  2. 在控制器中,有一个 Recieve 动作

    [HttpPost]    
    public JsonResult Recieve(byte[] audio)
         {
             // saving and status report logic here
         }
    

我的问题是:如何设置系统以将我从 Windows Phone 上传的文件绑定到Recieve操作的audiobyte[] 参数?

在手机上,数据通过以下方式上传:

BackgroundTransferRequest btr = new BackgroundTransferRequest (new Uri
                 (siteUrl + "Api/Audio/Recieve",UriKind.Absolute));
    btr.TransferPreferences = TransferPreferences.AllowBattery;
    btr.Method = "POST";
    btr.UploadLocation = new Uri("/" + Transfers + "/" + isoAudioFileName, UriKind.Relative);
Microsoft.Phone.BackgroundTransfer.BackgroundTransferService.Add(btr);
4

1 回答 1

0

我不太确定 BackgroundTransfer 使用什么协议来发送文件,但如果它将缓冲区直接写入 POST 请求的主体,您可以使用自定义模型绑定器直接从请求流中读取:

public class BTModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        using (var ms = new MemoryStream())
        {
            controllerContext.HttpContext.Request.InputStream.CopyTo(ms);
            return ms.GetBuffer();
        }
    }
}

可以这样注册:

[HttpPost]
public ActionResult Receive([ModelBinder(typeof(BTModelBinder))] byte[] audio)
{
    ...
}

如果它使用,multipart/form-data那么您可以使用标准HttpPostedFileBase操作参数,如此处所示

于 2012-01-10T13:46:40.270 回答