c# - 如何使用 web api 发送和接收文件

标签 c# asp.net-web-api2

我有一个 Api Post 方法,我希望它能够接受任何文件类型,它看起来像这样:

[HttpPost]
    public async Task<IHttpActionResult> Post()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

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

        if (provider.Contents.Count != 1)
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest,
                "You must include exactly one file per request."));
        }

        var file = provider.Contents[0];
        var filename = file.Headers.ContentDisposition.FileName.Trim('\"');
        var buffer = await file.ReadAsByteArrayAsync();
  }

当我尝试向它发布图像时,这在 fiddler 中有效。但是,我正在编写一个客户端库,并且有一个如下所示的方法:

        public string PostAttachment(byte[] data, Uri endpoint, string contentType)
    {
        var request = (HttpWebRequest)WebRequest.Create(endpoint);
        request.Method = "POST";
        request.ContentType = contentType;
        request.ContentLength = data.Length;

        var stream = request.GetRequestStream();
        stream.Write(data, 0, data.Length);
        stream.Close();

        var response = (HttpWebResponse) request.GetResponse();
        using (var reader = new StreamReader(response.GetResponseStream()))
        {
           return reader.ReadToEnd();
        }            
    }

每当我尝试使用它发布图像时,我都会收到 UnsuportedMediaType 错误。我假设这是因为我的图像不是多部分内容?有没有一种简单的方法可以让我请求正确的类型?

如果我必须更改我的 web api post 方法,是否有一种简单的方法可以做到这一点而无需将文件写入服务器并将其保存在内存中?

最佳答案

System.Net.Http 命名空间中的MultipartFormDataContent 将允许您发布多部分表单数据。

private async Task<string> PostAttachment(byte[] data, Uri url, string contentType)
{
  HttpContent content = new ByteArrayContent(data);

  content.Headers.ContentType = new MediaTypeHeaderValue(contentType); 

  using (var form = new MultipartFormDataContent())
  {
    form.Add(content);

    using(var client = new HttpClient())
    {
      var response = await client.PostAsync(url, form);
      return await response.Content.ReadAsStringAsync();
    }
  }
}

关于c# - 如何使用 web api 发送和接收文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34168395/

相关文章:

c# - 通过透明的 Windows 窗体防止鼠标点击

c# - 没有外键的 NHibernate 映射引用

.net - 缺少 WebApi OData HttpConfiguration 扩展方法

c# - Entity Framework 6 - ASP.NET 过滤器 - 并发添加

c# - ASP.Net Web API 和 JQuery Ajax - 如何处理 401 未经授权的结果

c# - 泛型的泛型结构 : can I create overloads for specific kinds(? 中的运算符重载)?

c# - 当表达式的开头相同时,如何使用 Sprache 解析表达式

c# - 如何在另一个 html 页面中包含一个 html 页面(作为标题)?

asp.net-web-api2 - 从服务器手动过期 JWT token - WEB API 2

c# - 如何在 ApiController 中为单个方法返回 JSON?