2

我一直在尝试将文件流式传输到我的网络服务。在我的 Controller(ApiController) 中,我有一个 Post 函数,如下所示:

public void Post(Stream stream)
{
    if (stream != null && stream.Length > 0)
    {
        _websitesContext.Files.Add(new DbFile() { Filename = Guid.NewGuid().ToString(), FileBytes= ToBytes(stream) });
        _websitesContext.SaveChanges();
    }
}

我一直在尝试通过执行以下操作使用我的 Web 客户端流式传输文件:

public void UploadFileStream(HttpPostedFileBase file)
{
    WebClient myWebClient = new WebClient();
    Stream postStream = myWebClient.OpenWrite(GetFileServiceUrl(), "POST");
    var buffer = ToBytes(file.InputStream);
    postStream.Write(buffer, 0,buffer.Length);
    postStream.Close();
}

现在,当我调试我的 Web 服务时,它会进入 Post 函数,但流始终为空。想知道是否有人知道为什么会这样?

4

3 回答 3

5

Web API 没有模型绑定到“流”类型,因此您会看到这种行为。您可以通过执行以下操作来捕获传入的请求流: Request.Content.ReadAsStreamAsync()

例子:

public async Task<HttpResponseMessage> UploadFile(HttpRequestMessage request)
    {
        Stream requestStream = await request.Content.ReadAsStreamAsync();

注意:您甚至不需要将 HttpRequestMessage 作为参数,因为您始终可以通过 ApiController 提供的“请求”属性访问此请求消息。

于 2013-03-12T16:01:26.840 回答
1

您可以用此代码替换

var uri = new Uri(GetFileServiceUrl());
Stream postStream = myWebClient.OpenWrite(uri.AbsoluteUri, "POST");
于 2012-09-07T09:21:34.433 回答
0

RestSharp让这类事情变得非常容易。建议尝试一下。

于 2012-09-08T12:47:58.793 回答