C# 如何在MVC应用程序中正确处理azure事件中心接收器?
我正在Microsoft Azure事件中心上做一个小项目。我需要显示我的Azure订阅到MVC应用程序的活动日志 我能够将事件日志流式传输到服务总线,在从EventHubReceiver接收数据时遇到问题。如果没有数据,接收器似乎会冻结。我知道这是因为eventhubs使用的pub-sub架构,但我希望控制流,因为我使用的是MVC应用程序 现在,我已经使用CancellationToken并显式等待6秒钟,让EventReceiver接收所有消息。有更好的方法吗C# 如何在MVC应用程序中正确处理azure事件中心接收器?,c#,asp.net-mvc,azure,azure-eventhub,C#,Asp.net Mvc,Azure,Azure Eventhub,我正在Microsoft Azure事件中心上做一个小项目。我需要显示我的Azure订阅到MVC应用程序的活动日志 我能够将事件日志流式传输到服务总线,在从EventHubReceiver接收数据时遇到问题。如果没有数据,接收器似乎会冻结。我知道这是因为eventhubs使用的pub-sub架构,但我希望控制流,因为我使用的是MVC应用程序 现在,我已经使用CancellationToken并显式等待6秒钟,让EventReceiver接收所有消息。有更好的方法吗 public class Ho
public class HomeController : Controller
{
// GET: Home
public ActionResult Index()
{
var cts = new CancellationTokenSource();
var list = new List<Record>();
for (int i = 0; i < 4; i++)
{
Task.Factory.StartNew((state) =>
{
var factory = MessagingFactory.CreateFromConnectionString("Endpoint=sb://xcvxcv.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=xcvxcvxvxvxcvxcccccccccccccccccccccccccc;TransportType=Amqp");
var client = factory.CreateEventHubClient("insights-operational-logs");
var group = client.GetDefaultConsumerGroup();
var receiver = group.CreateReceiver(state.ToString(), DateTime.Now.AddDays(-1));
while (true)
{
if (cts.IsCancellationRequested)
{
receiver.Close();
break;
}
var messages = receiver.Receive(10);
foreach (var message in messages)
{
var logMessage = Newtonsoft.Json.JsonConvert.DeserializeObject<LogEventMessage>(Encoding.Default.GetString(message.GetBytes()));
list.AddRange(logMessage.records);
}
}
}, i);
}
Thread.Sleep(5000);
cts.Cancel();
return View(list.OrderBy(o => o.time));
}
}
公共类HomeController:控制器
{
//到家
公共行动结果索引()
{
var cts=新的CancellationTokenSource();
var list=新列表();
对于(int i=0;i<4;i++)
{
Task.Factory.StartNew((状态)=>
{
var factory=MessagingFactory.CreateFromConnectionString(“Endpoint=sb://xcvxcv.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=XCvxVxCvxCccccccccccccc;TransportType=Amqp”);
var client=factory.CreateEventHubClient(“洞察操作日志”);
var group=client.GetDefaultConsumerGroup();
var receiver=group.CreateReceiver(state.ToString(),DateTime.Now.AddDays(-1));
while(true)
{
如果(cts.IsCancellationRequested)
{
receiver.Close();
打破
}
var消息=接收方接收(10);
foreach(消息中的var消息)
{
var logMessage=Newtonsoft.Json.JsonConvert.DeserializeObject(Encoding.Default.GetString(message.GetBytes());
list.AddRange(logMessage.records);
}
}
},i);
}
睡眠(5000);
cts.Cancel();
返回视图(list.OrderBy(o=>o.time));
}
}
我会考虑在EngServsSerix.
中实现EnvidiPrimor主机接口并控制流程。
< P>我会考虑在EngServsAssi.c/P>中实现EngestPosialHub接口并控制流程。
EventProcessorHost似乎正在使用StorageAccount。在没有存储帐户的情况下是否可以执行此操作?存储帐户主要用于存储检查点信息,因此在ProcessEventsAsync中,您执行工作,然后调用检查点。然后,如果您的应用程序失败,您可以从上次检查点开始恢复。另一个参考:这在c#控制台应用程序中运行得非常好,但是如何在mvc中使用它呢?EventProcessorHost似乎在使用StorageAccount。在没有存储帐户的情况下是否可以执行此操作?存储帐户主要用于存储检查点信息,因此在ProcessEventsAsync中,您执行工作,然后调用检查点。然后,如果您的应用程序失败,您可以从上次检查点开始恢复。另一个参考:这在c#控制台应用程序中运行得非常好,但是如何在mvc中使用它呢?