向webapi发出并发请求仅处理Selfhost Owin中的最后一个请求

时间:2018-10-22 09:31:57

标签: c# rest asp.net-web-api2 owin

我正在编写一个连接器服务,该服务将从一个系统中获取数据并将其放入另一个系统中。它是一种发布订阅模型,我已经在自托管Owin上为其创建了一个Web API,该监听器侦听来自系统的事件并将其更新到其他系统。

当请求顺序出现时,一切似乎都正常。问题是当请求并行时。这是最后一个赢得比赛的请求,所有旧请求似乎都丢失了。

该请求始终包含完整的数据集,即来自较早请求的数据。例如,如果发送了三个消息,则同时说出message-1,message-2,message-3。第一个响应包含“ message-1”,第二个响应包含“ message1和message2”,第三个响应包含“ message1,message2和message3”,因此在webapi中,我始终采用最新更新的消息并对其进行处理,以防万一webapi正在处理request-3,它将使用datetime提取message-3并将其插入系统。

因此,当webapi同时获取所有三个消息时,它只会插入消息3,而其他两个消息即消息1和消息2都将丢失。预期的行为应该以所有顺序插入所有3条消息-message1,message2和message3。也可以在两个独立请求同时出现时使用。请帮助。 下面是代码段。

 public void Configuration(IAppBuilder appBuilder)
        {
            // Configure Web API for self-host. 
            HttpConfiguration config = new HttpConfiguration();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            appBuilder.UseWebApi(config);
        } 

WebAPI代码-

public class EventListenerController : ApiController
{    
    Logger Log;

    [HttpPost]
    public IHttpActionResult AlertNotificationHandler(Object obj)
    {        

        try
        {

            string response = obj.ToString();               
            TaskListUpdateResponse taskListResult = jsonMgr.ParseUpdateTaskList((JsonConvert.DeserializeObject(response)).ToString());

            if (taskListResult != null && taskListResult.eventType != null &&
                taskListResult.eventType.Equals("tasklist.updated"))
            {                    
                DateTime createdOn = taskListResult.data.createdOn;
                List<RestHelper.Task> Tasks = taskListResult.data.tasks;                   
                string comment = "";                 
                DateTime timestamp = taskList.data.modifiedOn;


                Log.Info("Object received" + obj.ToString());                      
                int comp = 0, skip = 0;
                int totalTasks = Tasks.Count; 
                Activity activity = Tasks.SelectMany(x => x.activities).OrderByDescending(y => y.timestamp).FirstOrDefault();

                //Insert activity .......................

0 个答案:

没有答案