如何将Office Communicator中的所有用户获取到ASP.NET网页?

5

我面临一个严重的问题。我想在HTML表格中显示所有用户及其状态。是否可以使用JavaScript实现?

我已经查看了下面的链接,其中仅显示一个用户及其状态,并且用户邮件ID是硬编码的。

Integrate Microsoft Office Communicator 2007 in ASP.NET Page

Javascript

<script type="Javascript">

     var sipUri = "your.contact@your.domain.com";

     var nameCtrl = new ActiveXObject('Name.NameCtrl.1');
     if (nameCtrl.PresenceEnabled)
     {
        nameCtrl.OnStatusChange = onStatusChange;
        nameCtrl.GetStatus(sipUri, "1");
     }


     function onStatusChange(name, status, id)
     {
        // This function is fired when the contacts presence status changes.
        // In a real world solution, you would want to update an image to reflect the users presence
           alert(name + ", " + status + ", " + id);
     }

     function ShowOOUI()
     {
           nameCtrl.ShowOOUI(sipUri, 0, 15, 15);
     }

     function HideOOUI()
     {
           nameCtrl.HideOOUI();
     }

 </script>

HTML

 <span onmouseover="ShowOOUI()" onmouseout="HideOOUI()" style="border-style:solid">Your Contact</span>
 <table id="tblContacts" runat="server">
    <tr>
       <td> email id </td>
       <td> status </td>
    </tr>
    <tr>
       <td> --- </td>
       <td> --- </td>
    </tr>
    <tr>
       <td> --- </td>
       <td> --- </td>
    </tr>
    <tr>
       <td> --- </td>
       <td> --- </td>
    </tr>
 </table>

在这个例子中,它展示了一个单一用户,并且用户的邮件ID被定义为一个字符串(硬编码)。我想展示所有用户。这是否可以通过JavaScript实现?
任何解决方案/演示都会对我非常有帮助。
谢谢。

看起来你似乎无法获取联系人列表。你可能需要要求用户手动输入他们的联系人。 - johnnycardy
我使用了“Communicator API”和“NameCtrl”来获取联系人。我在我的回答中已经解释过了。 - Chandan Kumar
啊,干得好...但问题是关于JavaScript的 :-) - johnnycardy
@johnnycardy 谢谢Johny。我没有找到仅使用JavaScript获取所有联系人的方法。因此,我混合使用了Communicator API和NameCtrl - 这意味着将dll文件与JavaScript混合使用。无论如何,我已经得到了它。谢谢。 - Chandan Kumar
2个回答

1

经过长时间的尝试,我已经成功实现了所需的功能。 在这里,我将解释需要遵循的步骤。

我使用了“Communicator API”和“NameCtrl”来实现

1)请参阅此链接http://msdn.microsoft.com/en-us/library/bb787231%28v=office.12%29.aspx

我为什么要建议参考这个链接呢?因为要使用Microsoft Office Communicator Automation API开发应用程序,必须满足以下要求:

已在开发计算机上安装Microsoft Office Communicator 2007。

已在开发计算机上安装Microsoft Office Communicator 2007 SDK。SDK可从MSDN下载。

2)在服务器上安装Lync2010并登录。

3)从您的Web应用程序中添加对CommunicatorAPI.dll和CommunicatorPrivate.dll的引用。

我将在这里使用通讯员图片,这些图片是从 "http://www.microsoft.com/en-us/download/details.aspx?id=10503" 下载的。它是一个msi文件。下载并执行它。在演示中,您可以复制这些图像并添加到您的应用程序中。
以下是完整的解决方案。
HTML
<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="MARSWebCommunicator._Default" %>

<asp:Content runat="server" ID="FeaturedContent" ContentPlaceHolderID="FeaturedContent">
    <section class="featured">
        <div class="content-wrapper">
        </div>
    </section>
    <script src="Scripts/jquery-latest.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        var sipUri = "chandan.kumarpanda@yourdomain.com";
        var nameCtrl = new ActiveXObject('Name.NameCtrl.1');

        $(document).ready(function () {
            sipUri = $("#<%=HiddenField1.ClientID %>").val();
            if (sipUri != "") {
                if (nameCtrl.PresenceEnabled) {
                    nameCtrl.OnStatusChange = onStatusChange;
                    nameCtrl.GetStatus(sipUri, "1");
                }
            }
        });

        function onStatusChange(name, status, id) {
            // This function is fired when the contacts presence status changes.
            // In a real world solution, you would want to update an image to reflect the users presence
            //alert(name + ", " + status + ", " + id);
        }

        function ShowOOUI() {
            nameCtrl.ShowOOUI(sipUri, 0, 15, 15);
        }

        function HideOOUI() {
            nameCtrl.HideOOUI();
        }

    </script>
</asp:Content>
<asp:Content runat="server" ID="BodyContent" ContentPlaceHolderID="MainContent">
    <div>
        <asp:HiddenField ID="HiddenField1" runat="server" />
    </div>
    <div id="dvContactdetails">
        <table border="1">
            <tr>
                <td>Email Id</td>
                <td>Name</td>
                <td>Status</td>
            </tr>
            <tr>
                <td>
                    <asp:DropDownList ID="drpEmails" AutoPostBack="true" runat="server" OnSelectedIndexChanged="drpEmails_SelectedIndexChanged"></asp:DropDownList></td>
                <td>
                    <asp:Image ID="Image1" onmouseover="ShowOOUI()" onmouseout="HideOOUI()" ImageUrl="presence_images/presence_16-unknown.bmp" runat="server" />
                    <asp:Label ID="lblName" runat="server" Text="Contact Name"></asp:Label>
                </td>
                <td>
                    <asp:Label ID="lblStatus" runat="server" Text="Contact Status"></asp:Label></td>
            </tr>
        </table>
    </div>   
</asp:Content>

代码后台
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using CommunicatorAPI;

namespace MARSWebCommunicator
{
    public partial class _Default : Page
    {
        CommunicatorAPI.Messenger communicator = null;
        List<CustomContacts> lstContactDetails;


        protected void Page_Load(object sender, EventArgs e)
        {
            lstContactDetails = new List<CustomContacts>();
            communicator = new CommunicatorAPI.Messenger();
            string mymailid = "Chandan.kumarpanda@yourdomain.com";

            var contact = GetContact(mymailid);
            int s = (int) contact.Status;
            lblStatus.Text = GetStatus(s);

            if (!Page.IsPostBack)
            {
                drpEmails.Items.Add(mymailid);
                lblName.Text = contact.SigninName.ToString();
                HiddenField1.Value = contact.SigninName.ToString();

                lstContactDetails = GetAllEmailsWithFiendlyName();
                foreach (CustomContacts aContact in lstContactDetails)
                {
                    drpEmails.Items.Add(aContact.ContactEmailId);
                }
            }
        }

        protected void drpEmails_SelectedIndexChanged(object sender, EventArgs e)
        {
            string currentmailid = drpEmails.SelectedItem.Text;
            var contact = GetContact(currentmailid);
            lblName.Text = contact.FriendlyName.ToString();
            int s = (int)contact.Status;
            lblStatus.Text = GetStatus(s);

            if (HiddenField1.Value != "")
            {
                HiddenField1.Value = "";
                HiddenField1.Value = contact.SigninName.ToString();
            }
        }

        protected string GetStatus(int s)
        {
            string status = string.Empty;
            string src = string.Empty;
            int tempstatusno = s;
            switch (s)
            {
                case 0 :
                    status = "UNKNOWN";
                    src = "presence_images/presence_16-unknown.bmp";
                    break;
                case 1:
                    status = "OFFLINE";
                    src = "presence_images/presence_16-off.bmp";
                    break;
                case 2:
                    status = "ONLINE";
                    src = "presence_images/presence_16-online.bmp";
                    break;
                case 6:
                    status = "INVISIBLE";
                    src = "presence_images/presence_16-unknown.bmp";
                    break;
                case 10:
                    status = "BUSY";
                    src = "presence_images/presence_16-busy.bmp";
                    break;
                case 14:
                    status = "BE_RIGHT_BACK";
                    src = "presence_images/presence_16-idle-busy.bmp";
                    break;
                case 18:
                    status = "IDLE";
                    src = "presence_images/presence_16-idle-online.bmp";
                    break;
                case 34:
                    status = "AWAY";
                    src = "presence_images/presence_16-away.bmp";
                    break;
                case 50:
                    status = "ON_THE_PHONE";
                    break;
                case 66:
                    status = "OUT_TO_LUNCH";
                    break;
                case 82:
                    status = "IN_A_MEETING";
                    break;
                case 98:
                    status = "OUT_OF_OFFICE";
                    break;
                case 114:
                    status = "DO_NOT_DISTURB";
                    src = "presence_images/presence_16-dnd.bmp";
                    break;
                case 130:
                    status = "IN_A_CONFERENCE";
                    break;
                case 146:
                    status = "ALLOW_URGENT_INTERRUPTIONS";
                    break;
                case 162:
                    status = "MAY_BE_AVAILABLE";
                    break;
                case 178:
                    status = "CUSTOM";
                    break;
                default:
                    status = "OFFLINE";
                    src = "presence_images/presence_16-unknown.bmp";
                    Image1.ImageUrl = src;
                    break;
            }
            Image1.ImageUrl = src;
            return status;
        }

        public IMessengerContact GetContact(string signinName)
        {
            return communicator.GetContact(signinName, communicator.MyServiceId) as IMessengerContact;
        }

        public List<CustomContacts> GetAllEmailsWithFiendlyName()
        {
            List<CustomContacts> lstContacts = new List<CustomContacts>();

            IMessengerContacts messengerContacts = (IMessengerContacts)communicator.MyContacts;
            foreach (IMessengerContact acontact in messengerContacts)
            {
                CustomContacts aContact = new CustomContacts();
                aContact.ContactName = acontact.FriendlyName.ToString();
                aContact.ContactEmailId = acontact.SigninName.ToString();

                lstContacts.Add(aContact);
            }
            return lstContacts;
        }

    }

    public class CustomContacts
    {
        public string ContactEmailId { get; set; }
        public string ContactName { get; set; }
        public string ContactStatus { get; set; }
    }
}

0
你想为通信工具构建一个基本的基于Web的前端。Peter提供的链接将有助于显示在线状态信息,但仅限于您浏览的SharePoint页面上列出的人员名单。
为了显示您在通信工具联系人列表中定义的在线联系人,并能够向他们发送消息,您需要编写大量的客户端脚本来连接到您本地运行的通信工具实例。
开始查找的最佳位置将是Office Communicator 2007 SDK。

http://www.microsoft.com/downloads/details.aspx?FamilyID=ed1cce45-cc22-46e1-bd50-660fe6d2c98c&displaylang=en

如果你在网上搜索“Office Communicator APIs”,你会得到许多可能有用的链接。
统一通信论坛可能也会有帮助。

http://social.msdn.microsoft.com/Forums/en-US/category/uc


谢谢Imran,但这并没有帮助到我。我之前已经尝试过你提供的SDK链接,但由于需要在托管服务器上运行Office Communicator,而这在我的情况下是不可能的,所以我正在寻找任何JavaScript解决方案(从通信器中获取所有联系人/电子邮件ID,并将其与上述JavaScript代码实现)。这是否可能?有没有解决方案? - Chandan Kumar
一些有用的链接 http://stackoverflow.com/questions/10204711/can-microsoft-ocs-be-embedded-into-an-asp-net-web-page-how-long-should-it-take - Imran Ali Khan
另一个链接:http://geekswithblogs.net/jacobladams/archive/2011/05/03/use-hmtl-and-javascript-to-display-presence-controls-in-sharepoint.aspx - Imran Ali Khan
嗨,Imran,我已经查看了以下链接。在http://geekswithblogs.net/jacobladams/archive/2011/05/03/use-hmtl-and-javascript-to-display-presence-controls-in-sharepoint.aspx中也使用单个用户。我想要的是与此相同,但适用于所有用户。 - Chandan Kumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接