标签: pushstreamcontent

如何下载zip文件

我想从我的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

19
推荐指数
1
解决办法
2万
查看次数

HttpClient和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)

c# httpclient asp.net-web-api pushstreamcontent

10
推荐指数
1
解决办法
9092
查看次数

ASP.NET Web API:PushStreamContent刷新不刷新

PushStreamContent在ASP.NET Web API中使用将事件从服务器推送到客户端(使用服务器发送的事件)。每个发送的事件后,我打电话FlushStream缓存数据推送到客户端。但是,我注意到冲洗不会(总是)发生。有时,部分数据会发送到客户端,而其余的则在写入下一个事件时发送(这可能会在几秒钟后发生)。

这是一个代码示例:

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)

c# server-sent-events asp.net-web-api pushstreamcontent

7
推荐指数
1
解决办法
1676
查看次数

asp.net 5/mvc 6中的PushStreamContent无法正常工作

我试图迁移一个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)

c# pushstreamcontent asp.net-core-mvc asp.net-core

7
推荐指数
1
解决办法
6915
查看次数

WebAPI PushStreamContent远程主机关闭连接

我试图在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

5
推荐指数
1
解决办法
1443
查看次数

WebApi 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# asp.net-web-api pushstreamcontent

5
推荐指数
1
解决办法
998
查看次数

PushStreamContent不会发送最终的零长度块来表示流结束

我需要使用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

5
推荐指数
1
解决办法
984
查看次数