在Web API AspNet中,我们可以使用HttpResponseMessage对象来报告进度。具体操作如下所示:
class ProgressMessage { public int Percentage { get; set; } public string Message { get; set; } }
[HttpGet]
public HttpResponseMessage Get()
{
var stream = new PushStreamContent((stream, content, context) =>
{
for (int i = 0; i < 100; i++)
{
var progress = new ProgressMessage
{
Percentage = i+1,
Message = "Processing item " + (i+1).ToString()
};
var json = JsonConvert.SerializeObject(progress);
var bytes = Encoding.UTF8.GetBytes(json);
stream.Write(bytes, 0, bytes.Length);
stream.Flush();
Thread.Sleep(100);
}
stream.Close();
}, "application/octet-stream");
return new HttpResponseMessage(HttpStatusCode.OK)
{
Content = stream
};
}
getProgress(){ return this.httpClient.get("http://localhost:8080/api/values/get",{responseType: "text", observe: "events" }).pipe(map(res => { return JSON.parse(res) }),tap(event => { if (event.type === HttpEventType.DownloadProgress) { const percentDone = Math.round((100 * event.loaded) / event.total); this.progress = percentDone; } })); }
通过这种方式,我们就实现了在Web API AspNet和Angular之间报告进度的功能。