使用restsharp和WebAPI进行数据流

时间:2018-02-10 14:11:54

标签: c# asp.net-web-api restsharp sharepoint-online

我的目标是将文件GET和POST文件发送到SP Online。

我用这两种方法编写了一个WEB API。这些方法使用CSOM与SP Online进行交互。

GET将响应Ok(字节数组)返回给客户端,POST将整个文件上传到请求正文中,然后以块的形式上传到Sharepoint Online。

我被告知我应该使用流技术,因为上下文是一个具有许多同时请求的企业应用程序。因此,GET方法应该将流返回给客户端,客户端应该将请求作为流发送到POST。

在客户端,我被迫使用RestSharp库。

所以:

1)如何使用RestSharp处理流?

2)WebAPI如何返回流?

3)随着文件我发送大量元数据。如何以流模式上传文件并仅发送一次元数据?

客户端,get需要一个字节数组,post发送一个字节数组和元数据。

在线我发现了太多技巧。有标准的吗?

1 个答案:

答案 0 :(得分:2)

有一个非常基本的例子。它并未涵盖您的所有问题,但这是一个重要的开始。

使用RestSharp的客户端

(我做了小型的ASP.NET Core 2.0控制台应用程序)。将以下代码添加到Programm.cs)

using System;
using System.IO;
using RestSharp;

namespace RestSharpClient {
 class Program {
  public
  const string baseUrl = "http://localhost:58610/api/values"; // <-- Change URL to yours!
  static void Main(string[] args) {

   Console.ReadKey();
   string tempFile = Path.GetTempFileName();
   using(var writer = File.OpenWrite(tempFile)) {
    var client = new RestClient(baseUrl);
    var request = new RestRequest();
    request.ResponseWriter = (responseStream) => responseStream.CopyTo(writer);
    var response = client.DownloadData(request);
   }
   Console.ReadKey();
  }
 }
}

服务器

我的控制者:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Net.Http.Headers;

namespace Server.Controllers {
 [Route("api/[controller]")]
 public class ValuesController: Controller {
  // GET api/values
  [HttpGet]
  public FileStreamResult GetTest() {
   var stream = new MemoryStream(Encoding.ASCII.GetBytes("Hello World"));
   return new FileStreamResult(stream, new MediaTypeHeaderValue("text/plain")) {
    FileDownloadName = "test.txt"
   };
  }
 }
}

重要说明:启用CORS。为此,在service.AddMvc();

之前将以下行添加到Startup.cs
services.AddCors();

如何添加元数据:

WebAPI method that takes a file upload and additional arguments