如何在自托管的Web API上发送文件并在服务器上处理它?

时间:2015-08-12 00:28:20

标签: c# asp.net-web-api owin self-hosting

我使用Owin和Katana自我托管的网络API。我想从示例客户端发送文件(可能很大,几百MB),并希望将这些文件保存在服务器的磁盘上。目前只在本地计算机上测试服务器。

我在测试客户端的机器上有以下内容(它在这里显示图像,但它并不总是图像):

using System;
using System.IO;
using System.Net.Http;

class Program
{
    string port = "1234";
    string fileName = "whatever file I choose will be here";

    static void Main(string[] args)
    {
        string baseAddress = "http://localhost:" + port;
        InitiateClient(baseAddress);
    }

    static void InitiateClient(string serverBase)
    {
        Uri serverUri = new Uri(serverBase);
        using(HttpClient client = new HttpClient())
        {
            client.BaseAddress = serverUri;
            HttpResponseMessage response = SendImage(client, fileName);
            Console.WriteLine(response);
            Console.ReadLine();
        }
    }

    private static HttpResponseMessage SendImage(HttpClient client, string imageName)
    {
        using (var content = new MultipartFormDataContent())
        {
            byte[] imageBytes = System.IO.File.ReadAllBytes(imageName);
            content.Add(new StreamContent(new MemoryStream(imageBytes)), "File", "samplepic.png");
            client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("multipart/form-data"));
            return client.PostAsync("api/ServiceA", content).Result;
        }

    }

首先,这是使用POST发送文件的正确方法吗?

现在这里是我真正迷失的地方。我不知道如何保存我在ServiceAController的Post方法中接收的文件,该方法继承了ApiController。我看到其他一些使用HttpContext.Current的例子,但由于它是自托管的,它似乎是空的。

2 个答案:

答案 0 :(得分:0)

我会在上传之前将文件拆分成块。对于单个HTTP POST请求,100 Mb有点大。大多数Web服务器对HTTP请求大小也有一定的限制。

通过使用块,如果连接超时,则无需再次重新发送所有数据。

答案 1 :(得分:0)

无论您使用自托管还是IIS,无论是图像文件还是任何类型的文件都无关紧要。

您可以查看我的答案,为您提供简单的代码

https://stackoverflow.com/a/10765972/71924

关于大小,如果可能的话,最好是块,但这会为您的客户提供更多的工作(除非您也拥有API客户端代码),并且您必须在服务器上为您重建文件。

这将取决于所有文件是否超过100MB或只有少数。如果它们一直很大,我建议寻找http字节范围支持。这是http标准的一部分,我相信你可以找到使用WebAPI实现它的人