【发布时间】:2014-08-21 15:02:24
【问题描述】:
我将 PushStreamContent 与我的 REST API (ASP.NET Web API) 一起使用,效果很好。 HttpClient 可以在服务器处理完整请求之前请求资源并获取 HTTP-Response(服务器仍然写入推送流)。
作为 HttpClient 你必须做一件小事:使用 HttpCompletionOption.ResponseHeadersRead。
现在我的问题是: 是否有可能以另一种方式做到这一点? 从 HttpClient -> 通过 push-stream 将数据上传到 web api?
我实现如下,但是 web api 没有在客户端关闭流之前获取请求。
var asyncStream = new AsyncStream(fs);
PushStreamContent streamContent = new PushStreamContent(asyncStream.WriteToStream);
content.Add(streamContent);
HttpResponseMessage response = await c.SendAsync(new HttpRequestMessage(new HttpMethod("POST"), "http://localhost/...") { Content = content }, HttpCompletionOption.ResponseHeadersRead);
response.EnsureSuccessStatusCode();
AsyncStream 是我的委托类:
public async void WriteToStream(Stream outputStream, HttpContent content, TransportContext context)
这是 Push-Stream 所必需的。
这有可能吗? HttpClient 不会将请求发送到 web api,直到最后一个字节被写入流......
我该怎么办?是客户端的问题还是服务器/asp.net web api端的问题?
编辑: 这是 WriteToStream 的实现(但我不使用磁盘中的文件,而是使用内存流“myMemoryStream”(在构造函数中传递):
public void WriteToStream(Stream outputStream, HttpContent content, TransportContext context)
{
try
{
var buffer = new byte[4096];
using (var stream = myMemoryStream)
{
var bytesRead = 1;
while (bytesRead > 0)
{
bytesRead = video.Read(buffer, 0, buffer.Length);
outputStream.Write(buffer, 0, bytesRead);
}
}
}
catch (HttpException ex)
{
return;
}
finally
{
outputStream.Close();
}
}
也许我需要处理:HttpContent 内容、TransportContext 上下文?
【问题讨论】:
标签: c# asp.net-web-api httpclient pushstreamcontent