2012-09-07 101 views
1

我一直在尝试将文件流式传输到我的Web服务。在我的控制器(ApiController)我有一个帖子功能如下:Asp.net Web Api流式传输

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函数,但流始终为空。想知道是否有人可能有一个想法,为什么发生这种情况?

+0

什么是_websitesContext,你如何获得一个流作为动作参数?可能您应该访问请求和响应流 –

+0

_websitesContext用于将条目添加到数据库中。 Parv是不可能有一个流作为一个动作参数? – TBD

+0

另外,据我所知(但我可能会误解,或者在这里错误地记住),这在ASP.NET中不容易实现,导致ASP.NET等待,直到整个请求上传,直到它调用任何方法/文件位于该终点。 – Alxandr

回答

1

您可以使用此代码

var uri = new Uri(GetFileServiceUrl()); 
Stream postStream = myWebClient.OpenWrite(uri.AbsoluteUri, "POST"); 
0

RestSharp更换使得这种东西很容易做到。推荐尝试一下。

+1

RestSharp是一个客户端REST库。他正在编写一个REST服务器。这并没有回答他的问题。 –

4

Web API不会将模型绑定到'Stream'类型,因此您会看到该行为。你可以这样做,而不是捕捉传入的请求流:Request.Content.ReadAsStreamAsync()

例子:

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

注意:您甚至不需要有HttpRequestMessage作为参数,你总是可以访问此请求消息通过ApiController提供的“Request”属性。