我想从我的web api控制器下载一个zip文件.它正在返回文件但我收到一条消息,当我尝试打开时,zipfile无效.我已经看过其他关于此的帖子,响应是添加了responseType:'arraybuffer'.仍然不适合我.我也没有在控制台中出现任何错误.
var model = $scope.selection;
var res = $http.post('/api/apiZipPipeLine/', model)
res.success(function (response, status, headers, config) {
saveAs(new Blob([response], { type: "application/octet-stream", responseType: 'arraybuffer' }), 'reports.zip');
notificationFactory.success();
});
Run Code Online (Sandbox Code Playgroud)
api控制器
[HttpPost]
[ActionName("ZipFileAction")]
public HttpResponseMessage ZipFiles([FromBody]int[] id)
{
if (id == null)
{//Required IDs were not provided
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest));
}
List<Document> documents = new List<Document>();
using (var context = new ApplicationDbContext())
{
foreach (int NextDocument in id)
{
Document document = context.Documents.Find(NextDocument);
if (document == null)
{
throw new HttpResponseException(new …Run Code Online (Sandbox Code Playgroud) httpresponse zipfile asp.net-web-api angularjs pushstreamcontent
我将PushStreamContent与我的REST API(ASP.NET Web API)一起使用并且效果很好.HttpClient可以请求一个ressource并在服务器处理完整请求之前获取HTTP响应(服务器仍然写入推送流).
作为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();
Run Code Online (Sandbox Code Playgroud)
AsyncStream是我的代表类:
public async void WriteToStream(Stream outputStream, HttpContent content, TransportContext context)
Run Code Online (Sandbox Code Playgroud)
这对于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 = …Run Code Online (Sandbox Code Playgroud) 我试图迁移一个web api项目(经典的web.config项目),使用PushStreamContent到最新的asp.net 5 web应用程序(project.json).
我的问题是我无法让PushStreamContent工作.
当我使用这个api控制器时 - 结果将以json格式结束,而不是作为流:
[Route("api/[controller]")]
public class EventsController : Controller
{
private static readonly ConcurrentQueue<StreamWriter> s_streamWriter = new ConcurrentQueue<StreamWriter>();
[HttpGet]
public HttpResponseMessage Get(HttpRequestMessage request)
{
HttpResponseMessage response = request.CreateResponse();
response.Content = new PushStreamContent(new Action<Stream, HttpContent, TransportContext>(WriteToStream), "text/event-stream");
return response;
}
private void WriteToStream(Stream outputStream, HttpContent headers, TransportContext context)
{
var streamWriter = new StreamWriter(outputStream) {AutoFlush = true};
s_streamWriter.Enqueue(streamWriter);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我更改控制器操作以返回任务并在类MyPushStreamResult中包装PushStreamContent - 像这样:
[HttpGet]
public async Task<IActionResult> Get(HttpRequestMessage request)
{
var stream = new PushStreamContent(new Action<Stream, …Run Code Online (Sandbox Code Playgroud) 我PushStreamContent在ASP.NET Web API中使用将事件从服务器推送到客户端(使用服务器发送的事件)。每个发送的事件后,我打电话Flush对Stream缓存数据推送到客户端。但是,我注意到冲洗不会(总是)发生。有时,部分数据会发送到客户端,而其余的则在写入下一个事件时发送(这可能会在几秒钟后发生)。
这是一个代码示例:
public class MyController : ApiController
{
private static readonly string[] LineSeparators
= new[] { Environment.NewLine };
public HttpResponseMessage GetData(string id)
{
var response = Request.CreateResponse();
response.Content = new PushStreamContent(
new Func<Stream, HttpContent, TransportContext, Task>(StartStream),
new MediaTypeHeaderValue("text/event-stream") { CharSet = "UTF-8" });
return response;
}
private async Task StartStream(Stream outputStream, HttpContent content, TransportContext context)
{
using (outputStream)
using (var writer = new StreamWriter(outputStream, new UTF8Encoding(false)))
{
writer.NewLine = "\n";
while (true) …Run Code Online (Sandbox Code Playgroud) 我需要使用Odata协议通过WebAPI批量导出内容。我们正在尝试使用PushStreamContent将结果直接从数据库中流式传输。当我在本地IIS实例中运行该服务时,它运行良好,但是当我将该服务推送到服务器时,它将流传输数据,并在最后2 KB处暂停和“挂起”。
我通过跟踪文件大小来验证这一点。在本地运行时,我将得到一个9094KB的文件,当我将相同的代码部署到服务器上时,我将获得9092KB,然后连接保持打开状态并停止传输。如果我杀死客户端并查看文件,我将看到在写入过程中流被截断的json。此外,我可以查看IIS中打开的连接,并看到该连接仍处于活动状态。
无论如何,为什么PushStreamContent似乎只是停止发送数据而不关闭流?如果发生错误,则流和连接将关闭。
public HttpResponseMessage GetBulkExport(ODataQueryOptions<vwBulkExport> options)
{
var reportData = options.ApplyTo(dbContext.vwBulkExport, new ODataQuerySettings() { EnsureStableOrdering = false });
return new ResponseStreamer(Request).StreamAsync(reportData);
}
public class ResponseStreamer
{
private HttpRequestMessage request;
public ResponseStreamer(HttpRequestMessage request)
{
this.request = request;
}
public HttpResponseMessage StreamAsync(IQueryable data)
{
HttpResponseMessage response = request.CreateResponse();
response.Content = new PushStreamContent(
async (outputStream, httpContent, transportContext) =>
{
try
{
int counter = 0;
foreach (var item in data)
{
counter++;
string json = JsonConvert.SerializeObject(item);
var buffer = Encoding.UTF8.GetBytes(json);
await …Run Code Online (Sandbox Code Playgroud) asp.net asp.net-mvc odata pushstreamcontent asp.net-web-api2
我试图在MVC站点中使用WebAPI来使用PushStreamContent对象流式传输视频.我已经阅读了几篇关于这一点的内容(包括这篇经常被引用的文章@ strathweb.com,但似乎仍然无法实现这一点.
目前,视频无法在浏览器中播放.一旦用户将鼠标移到视频控件上,它们就会被禁用.服务器上出现两个奇怪的问题/症状:
首先,在页面加载时,服务器似乎立即流回整个文件,即使用户还没有尝试实际播放视频(他们只是看到标准的HTML5视频占位符 - 他们应该点击播放来观看视频).视频代码中未指定自动播放.我可以通过流循环中的debug.writeline调用看到这种情况.
其次,当用户确实单击播放时,会发生以下错误:远程主机关闭连接.错误代码是0x800704CD.
这是我的代码:
public class VideoController : ApiController
{
[ActionName("Get")]
public System.Net.Http.HttpResponseMessage Get(string fsoId)
{
var videoFullPath = GetPathToVideo(fsoId);
var response = Request.CreateResponse();
response.Content = new System.Net.Http.PushStreamContent( async (outputStream, context, transport) =>
{
try
{
var buffer = new byte[65536];
using (var videoFile = System.IO.File.Open(videoFullPath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
var length = (int)videoFile.Length;
var bytesRead = 1;
while (length > 0 && bytesRead > 0)
{
bytesRead = videoFile.Read(buffer, 0, Math.Min(length, buffer.Length));
System.Diagnostics.Debug.WriteLine(string.Format("Length at …Run Code Online (Sandbox Code Playgroud) c# asp.net video-streaming asp.net-web-api pushstreamcontent
使用Pushstreamcontent时处理错误的正确方法是什么?我使用Pushstreamcontent将数据直接从数据库流式传输到客户端。在客户端上,我在收到结果时使用HttpCompletionOption.ResponseHeadersRead。
在数据不可用的情况下,我想返回一个 HttpStatusCode 404 (Not Found) 例如。目前我只检测到在执行 lambda ( CopyBinaryValueToResponseStream )期间没有数据。那时我无法再更改 HttpResponeMessage 的状态。
那么处理这种情况的正确方法是什么?我想避免预先对数据库进行额外检查,但现在这似乎是完成它的唯一方法?
[Route("{id}")]
public HttpResponseMessage GetImage(int id)
{
HttpResponseMessage resp = new HttpResponseMessage();
// do I need to check here first if the data is available?
// and return 404 if the data is not available
// resp.StatusCode = HttpStatusCode.NotFound
// or can I handle it later from within the lambda?
resp.Content = new PushStreamContent(async (responseStream, content, context) =>
{
// what …Run Code Online (Sandbox Code Playgroud)c# ×5
asp.net ×2
angularjs ×1
asp.net-core ×1
asp.net-mvc ×1
httpclient ×1
httpresponse ×1
odata ×1
zipfile ×1