Iteam
GitHub

Kortaste exemplet på hur man använder Exchange 2007 Web Services

Förut använde man krångliga WebDav frågor som skickades via XML till Exchange-servern. Från och med Exchange 2007 finns det dock en inbyggd Web Service som man kan använda för att på ett smidigt sätt integrera direkt mot Exchange Server. Tyvärr är de flesta kodexempel för att använda denna Web Service väldigt komplicerade och långa, vilket minskar läsbarheten och ökar startsträckan att lära sig hur man använder den. Jag bestämde mig för att bena ut vad som är det enklaste exemplet för att läsa ut alla Tasks från ett användarkonto i Exchange. Innan du kan köra koden nedan behöver du lägga till WSDL-filen i Web References i Visual Studio (ex. https://exchange-server/ews/services.wsdl)

Så här "enkel" blev koden:

// server = ex. https://exchange-server
// exchangeCredentials är det konto som du vill hämta tasks från eller ett servicekonto – då anger du en mailbox i folders nedan
public List GetOutlookTasks(string serverUrl, Credentials exchangeCredentials)
{
  ExchangeServiceBinding esb = new ExchangeServiceBinding();
  esb.Credentials = exchangeCredentials;
  esb.Url = string.Format(@"{0}/EWS/Exchange.asmx", server);

  // Tell it you only want to look in the tasks folder
  DistinguishedFolderIdType[] folders = new DistinguishedFolderIdType[1];
  folders [0] = new DistinguishedFolderIdType();
  folders [0].Id = DistinguishedFolderIdNameType.tasks; // Smidigt att kunna ange typ av folder med hjälp av en typ och inte namn som kan variera

  // Form the FindItem request
  FindItemType findItemRequest = new FindItemType();
  findItemRequest.ItemShape = new ItemResponseShapeType();
  findItemRequest.ItemShape.BaseShape = DefaultShapeNamesType.AllProperties; // Viktigt för att man ska kunna se fler fält än systemfält
  findItemRequest.ParentFolderIds = folderIDArray;

     // Send the request and get the response
  FindItemResponseType findItemResponse = esb.FindItem(findItemRequest);

  if (findItemResponse.ResponseMessages.Items.Length > 0)
  {
    // Detta skulle man gärna slippa...
    FindItemResponseMessageType responseMessage = findItemResponse.ResponseMessages.Items[0] as FindItemResponseMessageType;
    ArrayOfRealItemsType realItems = responseMessage.RootFolder.Item as ArrayOfRealItemsType;

    List outlookTasks = new List();
    foreach (TaskType task in realItems.Items)
    {
      // smidigt att kunna anropa fälten direkt mha Intellisence och utan krångliga schemanamn etc
      Console.WriteLine("Task: {0} Duration: {1}-{2} \n", task.Subject, task.StartDate, task.DueDate);
      outlookTasks.Add(task);
    }

    return outlookTasks;
  }

  return null;
}

Christian Landgren
2008-03-18