【问题标题】:Exchange Webservice Error after 15 minutes: Thread was being aborted15 分钟后发生 Exchange Webservice 错误:线程被中止
【发布时间】:2016-01-04 21:15:57
【问题描述】:

我正在尝试从日历中获取所有约会。但 15 分钟后,获取停止,我收到以下错误消息:Thread was being aborted.

这是我的代码:

  public List<CalendarObjectClass> GetCalendarObjects(string manualRoomList, out string message,
        out List<ModifiedObjectClass> modifiedCalObjListe, string selectedExchangeVersion, string[] roomList)
    {
        var calObjListe = new List<CalendarObjectClass>();

        message = "";

        _es = GetExchangeServiceBinding(selectedExchangeVersion);


        var view = new ItemView(1000);

        var extendedpropSet = new PropertySet(BasePropertySet.IdOnly, AppointmentSchema.Organizer,
            AppointmentSchema.RequiredAttendees, AppointmentSchema.Recurrence,
            AppointmentSchema.DeletedOccurrences, AppointmentSchema.ModifiedOccurrences,
            AppointmentSchema.LastOccurrence);

        // Add a search filter that searches on the body or subject.
        var searchFilterCollection = new List<SearchFilter>
        {
            new SearchFilter.IsGreaterThan(AppointmentSchema.Start, DateTime.Now.AddYears(-1))
        };
        // Create the search filter.
        SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.Or,
            searchFilterCollection.ToArray());

        try
        {
            foreach (var room in roomList)
            {
                var appointments = _es.FindItems(new FolderId(WellKnownFolderName.Calendar, new Mailbox(room)),
                    searchFilter, view);

                foreach (var item in appointments)
                {
                    var appointment = (Appointment) item;
                    var extendedItem = Appointment.Bind(_es, appointment.Id, extendedpropSet);

                    byte[] value;
                    if (extendedItem.Recurrence != null)
                    {
                        if (extendedItem.LastOccurrence.Start < DateTime.Now)
                        {
                            continue;
                        }
                    }
                    else
                    {
                        if (appointment.Start < DateTime.Now)
                        {
                            continue;
                        }

                    }
                    var calobj = new CalendarObjectClass();
                    calobj.vondatum = appointment.Start;
                    calobj.bisdatum = appointment.End;
                    calobj.smtp = room;
                    if (OhneVeranstalter())
                    {
                        calobj.veranstalteremail = Funktionsaccount.Email;
                        calobj.veranstaltername = Funktionsaccount.BenutzerName;
                    }
                    else
                    {
                        calobj.veranstalteremail = extendedItem.Organizer.Address;
                        calobj.veranstaltername = extendedItem.Organizer.Name;
                    }

                    calobj.isrecurring = appointment.IsRecurring;
                    calobj.attendeecollection = extendedItem.RequiredAttendees;
                    calobj.personenanzahl = extendedItem.RequiredAttendees.Count;
                    calobj.recurrence = extendedItem.Recurrence;
                    calobj.deletedoccurrences = extendedItem.DeletedOccurrences;
                    calobj.modifiedoccurrences = extendedItem.ModifiedOccurrences;
                    calobj.itemid = appointment.Id;

                    SetExtendedRecurrenceInformation(extendedItem.Recurrence, ref calobj);

                    appointment.Load(propset);


                    if (appointment.TryGetProperty(pidLidCleanGlobalObjectId, out value))
                    {
                        calobj.correlationid = Convert.ToBase64String(value);
                    }

                    if (calobj.recurrence.NumberOfOccurrences == null && calobj.isrecurring)
                    {
                        calobj.recurrence.NumberOfOccurrences = GetOccurences(_es, calobj);
                    }

                    if (OhneVeranstalter())
                    {
                        calobj.thema = appointment.Subject;
                    }
                    else
                    {
                        calobj.thema = GetSubjectFromUser(calobj);
                    }

                    if (calobj.thema != "SubjectError" &&
                        (calobj.recurrence.NumberOfOccurrences > 0 && calobj.isrecurring || calobj.isrecurring == false))
                    {
                        calObjListe.Add(calobj);
                    }
                }
                Log.Debug("Raum: " + room + " wurde ausgelesen");
                message += "Raum: " + room + " wurde ausgelesen" + "<br>";
            }
        }
        catch (Exception ex)
        {
            Log.Debug("Fehler: Beim Auslesen der Kalenderobjekte ist ein Fehler aufgetreten: " + ex.Message);
            message += "Beim Auslesen der Kalenderobjekte ist ein Fehler aufgetreten: " + ex.Message + "<br>";
        }
        modifiedCalObjListe = modObjListe;
        return calObjListe;
    }

你能解释一下是什么问题吗?

是否有更好的解决方案从 EWS 获取数据。

在此先感谢...

【问题讨论】:

    标签: c# asp.net web-services visual-studio-2013 exchangewebservices


    【解决方案1】:

    默认情况下,appdomain 将在一段时间不活动后关闭。发生这种情况时,将为任何活动线程抛出 ThreadAbortException。有一些技术可以让它始终运行或adjust the timeout。您将需要利用其中一个选项来修复它。

    顺便说一句,处理单个 HTTP 请求需要 15 分钟并不是一个好主意。您应该以异步方式处理此问题。初始请求应启动长时间运行的作业,然后您可以获得作业结果。 Scott Hanselman 有一个great blog post 关于 ASP.NET 中的后台任务。我建议您选择其中一种方法并以此为基础。

    【讨论】:

      猜你喜欢
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      相关资源
      最近更新 更多