使用REST服务上传/下载跨平台文件的准则

时间:2014-12-04 13:37:34

标签: c# web-services rest cross-platform restful-architecture

我正在使用允许访问文件服务器的C#/ MVC / WebAPI创建REST服务。两个主要操作是上传文件或下载文件。我需要将服务公开给Window和Apple上的移动设备(Android和Apple)和Web浏览器。

我似乎无法找到有关如何设计此类功能的任何良好指导或最佳做法。我之前只构建了REST服务,使用JSON传递或返回数据。我看到了C#的例子,但后来被C#客户端代码使用了。我觉得文件涉及平台细节开始很重要,但我找不到任何支持这些的信息。也许我正在过度思考它。

我正在寻找的是建议或信息链接,其中概述了上传和下载文件的标准。例如,只要您接受POST调用中的文件进行上传,就足够了(让客户知道如何发布该文件)?如果有文件,我应该上传多少元数据?是通过GET调用下载文件以使调用返回文件的URL的最佳方法吗?我应该注意其他任何“陷阱”吗?

2 个答案:

答案 0 :(得分:2)

我怀疑你是在考虑它,上传和下载文件是相当标准的HTTP内容,没有任何特定于它的平台。下面是我前一段时间写的示例上传和下载web api操作,希望能指出正确的方向。

[Route("api/upload/")]
[HttpPost]
public async Task<IHttpActionResult> Upload()
{
   if (!Request.Content.IsMimeMultipartContent())
   {
       return StatusCode(HttpStatusCode.UnsupportedMediaType);
   }

   var provider = new MultipartMemoryStreamProvider();
   await Request.Content.ReadAsMultipartAsync(provider);

   var file = provider.Contents.FirstOrDefault();

   if (file == null)
   {
       return BadRequest("No file found");
   }

   var fileStream = await file.ReadAsStreamAsync();

   // Do something with thte filestream

   return Ok();
}

[Route("api/download/{id}")]
[HttpGet]
public async Task<IHttpActionResult> Download(Guid id)
{
   if (id == default(Guid))
   {
       return NotFound();
   }

   var file = await SomeAsynchMethod(id); // returns custom File type.

   if (file == null)
   {
       return NotFound();
   }

   var result = new HttpResponseMessage(HttpStatusCode.OK)
   {
       Content = new ByteArrayContent(file.FileDataBytes)
   };
   result.Content.Headers.ContentType = new MediaTypeHeaderValue(file.FileType);
   result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attatchment")
   {
       FileName = file.FileName
   };

   return ResponseMessage(result);
}

答案 1 :(得分:2)

这提供了提示,也提供了良好的阅读。 http://www.codeproject.com/Articles/838274/Web-API-Thoughts-of-Data-Streaming