PushStreamContent的Web API [英] PushStreamContent Web API

查看:424
本文介绍了PushStreamContent的Web API的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从网络API把我的数据的客户,所以我的Web API使用PushStreamContent。
我的数据全部学生数据库中。

 公开的Htt presponseMessage GETALL()
    {
        HTT presponseMessage响应=新HTT presponseMessage();
        变种学生= _symboleService.GetAll();
        response.Content =新PushStreamContent((学生,httpContent,上下文)=>
        {
            OnStreamAvailable(学生,httpContent,背景);
        },text / plain的);
        返回响应;    }    私人无效OnStreamAvailable(流流,HttpContent内容,TransportContext上下文)
    {
        StreamWriter的responseStreamWriter =新的StreamWriter(流);
        clients.Add(responseStreamWriter);
    }

但是,一个错误就显示在这一行的学生:

  response.Content =新PushStreamContent((学生,httpContent,上下文)=>


  

一个本地或命名参数学生不能在此范围内声明
  因为该名称是在一个封闭的本地作用域用于定义
  本地或参数


更新我的观点是将数据推送到客户端,
一些改装之后,这是我的code,但它显示了行错误,

  VAR学生= _symboleService.GetAll();


  

需要一个对象引用的非静态字段,方法或
  财产'SymbolesController._symboleService


 私有静态只读懒<定时器和GT; _timer =新懒人<定时器和GT;(()=>新建定时器(TimerCallback,NULL,0,1000));
    私人静态只读ConcurrentDictionary< StreamWriter的,StreamWriter的> _outputs =新ConcurrentDictionary< StreamWriter的,StreamWriter的>();    公众的Htt presponseMessage GETALL()
    {
        HTT presponseMessage响应=新HTT presponseMessage();
        response.Content =新PushStreamContent((responseStream,httpContent,上下文)=>
        {
            StreamWriter的responseStreamWriter =新的StreamWriter(responseStream);            _outputs.TryAdd(responseStreamWriter,responseStreamWriter);        },text / plain的);        计时器t = _timer.Value;        返回响应;
    }    //运行每秒的第一个请求到该控制器后
    //写入到所有当前活动的请求的响应流
    私有静态无效TimerCallback(对象状态)
    {        的foreach(在_ou​​tputs.ToArray变种KVP())
        {
            StreamWriter的responseStreamWriter = kvp.Value;            尝试
            {
                变种学生= _symboleService.GetAll();
                responseStreamWriter.Write(学生);
                responseStreamWriter.Flush();
            }
            赶上{}
        }
    }

顺便说一句,如果我在这里修改studentsby DateTime.Now,它的工作原理:

  responseStreamWriter.Write(学生);至
responseStreamWriter.Write(DateTime.Now);


解决方案

有一对夫妇在这里的问题是会阻碍你的进步。

首先,在你的PushStreamContent构造的动作不能重用变量名学生。看来,你认为你传递参考行动,但是这并不怎么工作的。

您可以试试这个:

  response.Content =新PushStreamContent(OnStreamAvailable,text / plain的);

但仍存在另一个问题。在PushStreamContent构造的动作的流是一个输出流。

 公共PushStreamContent(动作<流,HttpContent,TransportContext> onStreamAvailable);

您会想从您OnStreamAvailable处理程序中写入该流。

由于目前还不清楚是什么_symbolService.GetAll()方法,我只能猜测,一个byte []从方法产生的应写入你的行动本身的输出流。

假设你的学生数据是不是一个真正的流或流化本质上,这可能是PushStreamContent类的滥用。

I am trying to push my data from web API to client, so I use PushStreamContent in Web API. My data are all student exist in database.

public HttpResponseMessage GetAll()
    {
        HttpResponseMessage response = new HttpResponseMessage();
        var students = _symboleService.GetAll();
        response.Content = new PushStreamContent((students, httpContent, context) =>
        {
            OnStreamAvailable(students, httpContent, context);
        }, "text/plain");
        return response;

    }

    private void OnStreamAvailable(Stream stream, HttpContent content,TransportContext context)
    {
        StreamWriter responseStreamWriter = new StreamWriter(stream);
        clients.Add(responseStreamWriter);
    }

But an error shows on "students" on this line:

response.Content = new PushStreamContent((students, httpContent, context) =>

A local or parameter named 'students' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter

Update My point here is to push the data to the client side, After some modification, this my code but it shows an error on line,

var students = _symboleService.GetAll();

An object reference is required for the non-static field, method, or property 'SymbolesController._symboleService'

private static readonly Lazy<Timer> _timer = new Lazy<Timer>(() => new Timer(TimerCallback, null, 0, 1000));
    private static readonly ConcurrentDictionary<StreamWriter, StreamWriter> _outputs = new ConcurrentDictionary<StreamWriter, StreamWriter>();

    public HttpResponseMessage GetAll()
    {
        HttpResponseMessage response = new HttpResponseMessage();
        response.Content = new PushStreamContent((responseStream, httpContent, context) =>
        {
            StreamWriter responseStreamWriter = new StreamWriter(responseStream);

            _outputs.TryAdd(responseStreamWriter, responseStreamWriter);

        }, "text/plain");

        Timer t = _timer.Value;

        return response;
    }



    // Runs every second after the first request to this controller and
    // writes to the response streams of all currently active requests
    private static void TimerCallback(object state)
    {

        foreach (var kvp in _outputs.ToArray())
        {
            StreamWriter responseStreamWriter = kvp.Value;

            try
            {
                var students = _symboleService.GetAll();
                responseStreamWriter.Write(students);
                responseStreamWriter.Flush();
            }
            catch { }
        }
    }

By the way, if I change studentsby DateTime.Now here, it works:

responseStreamWriter.Write(students); to
responseStreamWriter.Write(DateTime.Now);

解决方案

There are a couple of issues here that are going to impede your progress.

To start with, the Action in your PushStreamContent constructor cannot reuse the variable name "students". It appears that you think you're passing the reference to the Action, but that's not how this works.

You could try this:

response.Content = new PushStreamContent(OnStreamAvailable, "text/plain");

But there remains another problem. The stream in the PushStreamContent constructor's action is an output stream.

public PushStreamContent(Action<Stream, HttpContent, TransportContext> onStreamAvailable);

You'll want to write to that stream from within your OnStreamAvailable handler.

Since it's not clear what the _symbolService.GetAll() method, I can only speculate that a Byte[] generated from the method should be written to your output stream within your action itself.

Assuming that your student data is not really a stream or inherently streamable, this may be a misuse of the PushStreamContent class.

这篇关于PushStreamContent的Web API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆