Asp.net mvc 3 使用Windows Phone BackgroundTransfer服务以RESTful方式将文件上载到MVC3站点

Asp.net mvc 3 使用Windows Phone BackgroundTransfer服务以RESTful方式将文件上载到MVC3站点,asp.net-mvc-3,windows-phone-7,rest,upload,background-transfer,Asp.net Mvc 3,Windows Phone 7,Rest,Upload,Background Transfer,我需要我的Windows Phone应用程序能够使用Mango提供的BackgroundTransferService将音频文件上传到我的MVC3站点 作为一种可能的解决方案,我可以: 将路线映射到我的控制器: public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "SingleAudioFile",

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

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

  • 将路线映射到我的控制器:

    public override void RegisterArea(AreaRegistrationContext context)
            {
                context.MapRoute(
                    "SingleAudioFile",
                    "Api/Audio/Recieve",
                    new { controller = "AudioFiles", action = "Recieve" }
                    );
            }
    
  • 在控制器中,具有接收操作

    [HttpPost]    
    public JsonResult Recieve(byte[] audio)
         {
             // saving and status report logic here
         }
    
  • 我的问题是:如何设置系统将我从Windows Phone上传的文件绑定到
    接收器
    操作的
    音频
    字节[]参数

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

    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);
    

    我不太确定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
    操作参数作为。

    我不太确定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
    操作参数作为。

    谢谢Darin。今天我将尝试这种方法,如果有效的话,我会回来标记答案。至于BackgroundTransferService,微软已经发布了一个BTS实验室的培训工具包,但是没有提供服务器端的源代码,因此没有进一步的研究就无法了解如何实现服务器处理。谢谢Darin。今天我将尝试这种方法,如果有效的话,我会回来标记答案。至于BackgroundTransferService,微软的人已经在BTS实验室发布了一个培训工具包,但没有提供服务器端的源代码,因此没有进一步的研究就无法了解如何实现服务器处理。