c# - 如何在 asp.net core 中创建无限流端点

标签 c# asp.net-core

我想创建:

  • VS2017 中的 ASP.NET Core 1.1 Web 应用程序,带有一个 HttpGet 端点
  • 端点应传输 0 到 255 之间的随机值
  • 值应该每 20 毫秒更改一次。
  • 客户端永远不要停止读取流并尽快获取新值。

到目前为止,这是我的代码:

客户端

    public async Task SubscribeToUpdates()
    {
        this.subscribe = false;
        try
        {
            var client = new HttpClient();
            var stream = await client.GetStreamAsync(Constants.SubscribeEndpoint);

            using (var rdr = new StreamReader(stream))
            {
                while (!rdr.EndOfStream && !subscribe)
                {
                    var result = rdr.ReadLine();
                    var json = JObject.Parse(result);
                    this.HandleUpdateResult(json); // todo
                }
            }
        }
        catch (Exception e)
        {
            // TO do: log exception
        }
    }

服务器,不工作

    [HttpGet]
    public Task PushStreamContent()
    {
        HttpContext.Response.ContentType = "text/event-stream";
        var sourceStream = randomStream();
        return sourceStream.CopyToAsync(HttpContext.Response.Body);
    }

    public static Stream randomStream()
    {
        Random rnd = new Random();
        MemoryStream stream = new MemoryStream();
        StreamWriter writer = new StreamWriter(stream);
        writer.Write(JsonConvert.SerializeObject(rnd.News(0,255));
        writer.Flush();
        stream.Position = 0;
        return stream;
    }

问题:

  • 如何重写 Server 函数来创建无限流?
  • 我们也欢迎其他解决方案,只要牢记它们符合 .net 核心并使客户能够尽快获得最新信息。

工作完整的 .Net 版本

我已经为 .net Standard 编写了代码,但不是为 .net core 编写的。原因是 .net core 中不存在 PushStreamContent :/.

    [HttpGet]
    public HttpResponseMessage PushStreamContent()
    {
        var response = Request.CreateResponse(HttpStatusCode.Accepted);

        response.Content =
            new PushStreamContent((stream, content, context) =>
            {
                var plotter = new Plotter();

                while (true)
                {
                    using (var writer = new StreamWriter(stream))
                    {
                        Random rnd = new Random()
                        writer.WriteLine(rnd.Next(0,255));
                        stream.Flush();
                        Thread.Sleep(20);
                    }
                }
            });

        return response;
    }

最佳答案

感谢“Mike McCaughan”和“Joel Harkes”之前的回答,我重新考虑了通信过程并从 REST 切换到 Websockets。

您可以找到一个很好的示例,了解如何在 .net Core(和 Xamarin.Forms)中使用 WebSockets here .您将不得不使用 Nuget 包“Websockets.PCL”。

关于c# - 如何在 asp.net core 中创建无限流端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43280185/

相关文章:

c# - 无法访问隐藏代码中的控件 ID

c# - 延迟执行 - 字典输出

asp.net-core - 生成的 jwt token 中的受众为空

c# - 在 ASP.NET Core 中初始化依赖注入(inject)时传递参数

asp.net - 从response.Content.ReadAsStringAsync()获取C#对象列表

c# - 通过共享内存将 C++ char* 传递给 C#

c# - 如何知道从 C++ dll 传递到 C# 的数组的大小

c# - 如何为 Azure AD B2C 用户将 TokenValidationParameters.NameClaimType 设置为 "username"而不是 "name"?

javascript - 结合 Asp.Net Core 服务器端和 React 客户端

c# - 如何根据域名加载不同的Layout页面?