[英]Listening to text/event-stream using C#
我正在編寫一個 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 指出的錯誤,但事件流仍然沒有被第二次拾取。
當您將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
}
那么我想每次都應該引發這個事件。
namespace WindowsFormsApp3
{
public partial class Form1 : Form
{
WebClient myWebRequest = null;
String Path = "http://192.168.196.106/home/events/";
Uri uri = null;
public Form1()
{
InitializeComponent();
uri = new Uri(Path);
this.myWebRequest = new WebClient();
this.myWebRequest.Headers.Set("Host", "192.168.196.106");
this.myWebRequest.OpenReadCompleted += MyWebRequest_OpenReadCompleted;
}
private async void MyWebRequest_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
using (var sr = new StreamReader(e.Result))
{
try
{
while (true)
{
var message = await sr.ReadLineAsync();
Debug.WriteLine("message = {0}", (object)message);
}
}
catch (WebException ex)
{
Debug.WriteLine("WebException: {0}", (object)ex.Message);
}
catch (IOException ex)
{
Debug.WriteLine("IOException: {0}", (object)ex.Message);
}
catch (Exception ex)
{
Debug.WriteLine("Exception: {0}", (object)ex.Message);
}
}
}
private void button1_Click(object sender, EventArgs e)
{
myWebRequest.OpenReadAsync(uri);
}
private void button2_Click(object sender, EventArgs e)
{
myWebRequest.CancelAsync();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.