2012-09-25 22 views
5

Tengo la dirección de correo electrónico de un usuario de Lync y quiero enviarle un mensaje instantáneo.API de Lync: ¿Cómo enviar un mensaje instantáneo al contacto por dirección de correo electrónico?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Microsoft.Lync.Model; 
using Microsoft.Lync.Model.Conversation; 


namespace Build_Server_Lync_Notifier 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args.Length != 2) 
      { 
       Console.WriteLine("Usage: bsln.exe <uri> <message>"); 
       return; 
      } 

      LyncClient client = Microsoft.Lync.Model.LyncClient.GetClient(); 
      Contact contact = client.ContactManager.GetContactByUri(args[0]); 

      Conversation conversation = client.ConversationManager.AddConversation(); 
      conversation.AddParticipant(contact); 

      Dictionary<InstantMessageContentType, String> messages = new Dictionary<InstantMessageContentType, String>(); 
      messages.Add(InstantMessageContentType.PlainText, args[1]); 

      InstantMessageModality m = (InstantMessageModality) conversation.Modalities[ModalityTypes.InstantMessage]; 
      m.BeginSendMessage(messages, null, messages); 

      //Console.Read(); 
     } 
    } 
} 

pantalla Lync problems Enlace a la gran pantalla: http://i.imgur.com/LMHEF.png

Como se puede ver en esta captura de pantalla, mi programa no parece realmente a trabajar, a pesar de que soy capaz de buscar manualmente subir el contacto y enviar un mensaje instantáneo de forma manual.

También he intentado usar ContactManager.BeginSearch() en lugar de ContactManager.GetContactByUri(), pero no obtuvo el mismo resultado (se puede ver en la captura de pantalla): http://pastie.org/private/o9joyzvux4mkhzsjw1pioa

+0

no puedo ver nada a estado ¿Por qué no funciona? ¿Puedes habilitar los registros de depuración en l? ync (configuración bajo "pestaña" general) y poner el resultado aquí – Neo

+0

@Neo http://pastie.org/private/igdb3rgsdjfmujyl2j7q –

+0

Intentaré comparar el registro de un intento (manual) exitoso con el registro de mi C# fallido intentarlo mientras tanto. –

Respuesta

6

Ok, así que ahora tengo trabajo. Lo tengo en buen estado, aunque necesito hacer una refacturación seria.

Program.cs

using System; 

namespace Build_Server_Lync_Notifier 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      if (args.Length != 2) 
      { 
       Console.WriteLine("Usage: bsln.exe <uri> <message>"); 
       return; 
      } 

      LyncManager lm = new LyncManager(args[0], args[1]); 

      while (!lm.Done) 
      { 
       System.Threading.Thread.Sleep(500); 
      } 
     } 
    } 
} 

LyncManager.cs

using Microsoft.Lync.Model; 
using Microsoft.Lync.Model.Conversation; 
using System; 
using System.Collections.Generic; 

namespace Build_Server_Lync_Notifier 
{ 
    class LyncManager 
    { 
     private string _uri; 
     private string _message; 
     private LyncClient _client; 
     private Conversation _conversation; 

     private bool _done = false; 
     public bool Done 
     { 
      get { return _done; } 
     } 

     public LyncManager(string arg0, string arg1) 
     { 
      _uri = arg0; 
      _message = arg1; 
      _client = Microsoft.Lync.Model.LyncClient.GetClient(); 
      _client.ContactManager.BeginSearch(
       _uri, 
       SearchProviders.GlobalAddressList, 
       SearchFields.EmailAddresses, 
       SearchOptions.ContactsOnly, 
       2, 
       BeginSearchCallback, 
       new object[] { _client.ContactManager, _uri } 
      ); 
     } 

     private void BeginSearchCallback(IAsyncResult r) 
     { 
      object[] asyncState = (object[]) r.AsyncState; 
      ContactManager cm = (ContactManager) asyncState[0]; 
      try 
      { 
       SearchResults results = cm.EndSearch(r); 
       if (results.AllResults.Count == 0) 
       { 
        Console.WriteLine("No results."); 
       } 
       else if (results.AllResults.Count == 1) 
       { 
        ContactSubscription srs = cm.CreateSubscription(); 
        Contact contact = results.Contacts[0]; 
        srs.AddContact(contact); 
        ContactInformationType[] contactInformationTypes = { ContactInformationType.Availability, ContactInformationType.ActivityId }; 
        srs.Subscribe(ContactSubscriptionRefreshRate.High, contactInformationTypes); 
        _conversation = _client.ConversationManager.AddConversation(); 
        _conversation.AddParticipant(contact); 
        Dictionary<InstantMessageContentType, String> messages = new Dictionary<InstantMessageContentType, String>(); 
        messages.Add(InstantMessageContentType.PlainText, _message); 
        InstantMessageModality m = (InstantMessageModality)_conversation.Modalities[ModalityTypes.InstantMessage]; 
        m.BeginSendMessage(messages, BeginSendMessageCallback, messages); 
       } 
       else 
       { 
        Console.WriteLine("More than one result."); 
       } 
      } 
      catch (SearchException se) 
      { 
       Console.WriteLine("Search failed: " + se.Reason.ToString()); 
      } 
      _client.ContactManager.EndSearch(r); 
     } 

     private void BeginSendMessageCallback(IAsyncResult r) 
     { 
      _conversation.End(); 
      _done = true; 
     } 
    } 
} 
3

Trate A continuación Código de su funcionamiento muy bien para mí

protected void Page_Load(object sender, EventArgs e) 
{ 
    SendLyncMessage(); 
} 
private static void SendLyncMessage() 
{ 
    string[] targetContactUris = {"sip:[email protected]"}; 
    LyncClient client = LyncClient.GetClient(); 
    Conversation conv = client.ConversationManager.AddConversation(); 

    foreach (string target in targetContactUris) 
    { 
    conv.AddParticipant(client.ContactManager.GetContactByUri(target)); 
    } 
    InstantMessageModality m = conv.Modalities[ModalityTypes.InstantMessage] as InstantMessageModality; 
    m.BeginSendMessage("Test Message", null, null); 
} 
+0

Gracias! ¡Eso también funciona para mí! – derekantrican

Cuestiones relacionadas