是否可以在长时间运行的请求中通过ServiceStack流式传输部分结果?

时间:2017-10-11 12:34:12

标签: c# angular http servicestack httpresponse

我的ServiceStack API上有一个长时间运行的数据库复制请求。完成后,它返回数据库复制过程的日志。

我希望返回每一行的响应,因为它被添加到包含数据库副本日志的List对象中。

响应将由angular4应用程序接收,所以我想如果这是可能的,我还需要在angular4中配置一些东西以在每次响应更新时改变状态(ngrx)。

说实话,我不确定从哪里开始。

有人有任何想法吗?

1 个答案:

答案 0 :(得分:3)

要转发ServiceStack中的回复,您只需直接写入readyState == 3即可在服务中执行此操作:

<script>
var xhr = new XMLHttpRequest();
xhr.open('GET', '/stream');
xhr.seenBytes = 0;

xhr.onreadystatechange = function() {
  console.log("state change.. state: "+ xhr.readyState);

  if(xhr.readyState == 3) {
    var newData = xhr.response.substr(xhr.seenBytes);
    console.log("newData: <<" +newData+ ">>");
    document.body.innerHTML += "New data: <<" +newData+ ">><br />";

    xhr.seenBytes = xhr.responseText.length;
    console.log("seenBytes: " +xhr.seenBytes);
  }
};

xhr.addEventListener("error", function(e) {
  console.log("error: " +e);
});

console.log(xhr);
xhr.send();
</script>

或者返回实现{{1}}或{{1}}的结果,例如:

{{1}}

哪些内容将写入不响应缓冲响应的主机的响应OutputStream,对于IIS / ASP.NET,您需要确保Response Buffering is disabled

然后问题变成如何处理客户端上的部分响应,这需要通过处理{{1}}的响应来手动编码浏览器的{{1}} API,例如:

{{1}}

这很快就会变得笨拙,特别是如果您正在尝试流式传输像JSON这样的序列化格式,您需要确保客户端可以构建有效的JSON格式。

如果您只是想在客户端下载整个响应时通知客户端更新,我建议使用Server Events之类的内容,在您将响应流式传输到客户端时逐步发送客户端通知更新。