使用C#监听文本/事件流

时间:2012-07-13 08:12:48

标签: c# server-sent-events event-stream

我正在编写一个C#类来包装一个简单的Web服务。 RESTful的东西很容易结束,但现在我需要在服务器上的某些东西发生变化时引发一个事件。

我已经设置了服务器以使事件流可用,但我不知道如何在C#中获取流。

目前我喜欢这样的事情:

public class ServiceWrapper
{
    private readonly wc = new WebClient();

    public ServiceWrapper()
    {
        wc.OpenReadAsync(new Uri(UriOfEvent));
        wc.OpenReadCompleted += ServerEventOccurs;
    }

    private void ServerEventOccurs(object sender, OpenReadCompletedEventArgs args)
    {
        using (var sr = new StreamReader(args.Result))
        {
            var message = ParseStream(sr);
            RaiseServerEventOccurred(message);
        }

        wc.OpenReadAsync(new Uri(UriOfEvent));
    } 

    //usual code for declaring and raising ServerEventOccurred event
}

在我的测试中,事件被拾取一次,但不是两次。服务器上的事件本质上是一个开关 - 事情发生了,它继续发生,其他事情发生,它就会消失。我知道切换工作,因为我已将事件流连接到正常的网页进行测试。

我应该如何处理C#中的事件流?

编辑1:我已更新代码以修复TimVK指出的错误,但事件流仍然没有被第二次拾取。

1 个答案:

答案 0 :(得分:1)

当你将wc作为一个属性而不是在你的方法中创建一个新属性时,它不起作用吗?

public class ServiceWrapper 
{ 
    WebClient wc {get;set;}
    public ServiceWrapper() 
    { 
        wc = new WebClient(); 
        wc.OpenReadAsync(new Uri(UriOfEvent)); 
        wc.OpenReadCompleted += ServerEventOccurs; 
    } 

    private void ServerEventOccurs(object sender, OpenReadCompletedEventArgs args) 
    { 
        using (var sr = new StreamReader(args.Result)) 
        { 
            var message = ParseStream(sr); 
            RaiseServerEventOccurred(message); 
        } 

        wc = new WebClient(); 
        wc.OpenReadAsync(new Uri(UriOfEvent)); 
    }  

    //usual code for declaring and raising ServerEventOccurred event 
} 

然后我想每次都应该提出这个事件。