需要在SharePoint online 显示 CRM online的数据,并且有交互。需要开发是肯定的。由于我的本性能有限,
所以不太可能使用本机开发,使用虚拟机发现速度太慢,于是我选择了使用 Azure。结果顺利完成任务。开发分享。
实现方案一,Azure 环境安装了完成的share point平台 二,必须有读取CRM DynamicS的权限。三,VS开发工具 开发webpart。
如果想部署到SharePoint online上,开发的项目必须是Sandbox。
使用的开发环境是:VS2013 framework 4.0
首先在webpart 里写代码,调用CRM里的数据,是Dynamic代码,以下是webpart代码和从Dynamics 读取数据的代码。是从 SDK的示例代码里取到,当然我是获得MS CRM协助完成的。
protected void SDKCRM() { Uri orgServiceUri = new Uri("https://xxxxxxxxx.crm5.dynamics.com/XRMServices/2011/Organization.svc"); var clientCredentials = new ClientCredentials(); clientCredentials.UserName.UserName = "[email protected]"; \\这里是CRM登录管理员的账号,如果有AD策略则可以省略 clientCredentials.UserName.Password = "@#@#!@#$**(&&&"; \\ 这里是密码 IOrganizationService orgService = new OrganizationServiceProxy(orgServiceUri, null, clientCredentials, null); \\获得CRM的服务 //get current Name //WhoAmIRequest whoAmIReq = new WhoAmIRequest(); //WhoAmIResponse whoAmIResponse = (WhoAmIResponse)orgService.Execute(whoAmIReq); \\获得当前用户的 //throw new Exception(whoAmIResponse.UserId.ToString()); QueryExpression query = new QueryExpression("contact"); query.ColumnSet = new ColumnSet(true); query.Criteria.AddCondition("createdon", ConditionOperator.NotNull); EntityCollection contactCol = orgService.RetrieveMultiple(query); var contactList = contactCol.Entities; DataTable mydt = GetContact("[email protected]", orgService); \\根据这个条件 获得用户数据 string GetGUID = mydt.Rows[0]["contactid"].ToString(); TextBox1.Text = contactCol.Entities.Count.ToString(); DataTable myDetail= GetIncident(GetGUID, orgService); GridView1.DataSource = myDetail; GridView1.DataBind(); \\显示数据 }
/// <summary> /// 根据邮件地址获取联系人信息 /// </summary> /// <param name="sEmail">邮件地址</param> /// <param name="service">CRM组织服务</param> /// <returns></returns> protected DataTable GetContact(string sEmail, IOrganizationService service) { ConditionExpression conexp1 = new ConditionExpression(); conexp1.AttributeName = "emailaddress1"; conexp1.Operator = ConditionOperator.Equal; conexp1.Values.Add(sEmail); FilterExpression filexp1 = new FilterExpression(); filexp1.Conditions.Add(conexp1); QueryExpression quexp = new QueryExpression("contact"); quexp.ColumnSet.AddColumns("firstname"); // 名 quexp.ColumnSet.AddColumns("lastname"); // 姓 quexp.ColumnSet.AddColumns("fullname"); // 全名 quexp.ColumnSet.AddColumns("jobtitle"); // 职务 quexp.ColumnSet.AddColumns("contactid"); // 联系人主键 quexp.ColumnSet.AddColumns("department"); // 部门 quexp.ColumnSet.AddColumns("emailaddress1"); // 电子邮件 quexp.ColumnSet.AddColumns("parentcustomerid"); // 公司名称 quexp.ColumnSet.AddColumns("mobilephone"); // 移动电话 quexp.ColumnSet.AddColumns("telephone1"); // 商务电话 quexp.Criteria.AddFilter(filexp1); EntityCollection entcolTep = service.RetrieveMultiple(quexp); DataTable dtContact = new DataTable("contact"); System.Type tyString = System.Type.GetType("System.String"); System.Type tyGuid = System.Type.GetType("System.Guid"); DataColumn dcTep = new DataColumn("firstname", tyString); dtContact.Columns.Add(dcTep); dcTep = new DataColumn("lastname", tyString); dtContact.Columns.Add(dcTep); dcTep = new DataColumn("fullname", tyString); dtContact.Columns.Add(dcTep); dcTep = new DataColumn("jobtitle", tyString); dtContact.Columns.Add(dcTep); dcTep = new DataColumn("contactid", tyGuid); dtContact.Columns.Add(dcTep); dcTep = new DataColumn("department", tyString); dtContact.Columns.Add(dcTep); dcTep = new DataColumn("emailaddress1", tyString); dtContact.Columns.Add(dcTep); dcTep = new DataColumn("parentcustomerid", tyString); dtContact.Columns.Add(dcTep); dcTep = new DataColumn("mobilephone", tyString); dtContact.Columns.Add(dcTep); dcTep = new DataColumn("telephone1", tyString); dtContact.Columns.Add(dcTep); int iCount = entcolTep.Entities.Count; for (int i = 0; i < iCount; i++) { DataRow drTep = dtContact.NewRow(); if (entcolTep.Entities[i].Attributes.Contains("firstname")) { drTep["firstname"] = entcolTep.Entities[i].Attributes["firstname"]; } if (entcolTep.Entities[i].Attributes.Contains("lastname")) { drTep["lastname"] = entcolTep.Entities[i].Attributes["lastname"]; } drTep["fullname"] = entcolTep.Entities[i].Attributes["fullname"]; if (entcolTep.Entities[i].Attributes.Contains("jobtitle")) { drTep["jobtitle"] = entcolTep.Entities[i].Attributes["jobtitle"]; } if (entcolTep.Entities[i].Attributes.Contains("department")) { drTep["department"] = entcolTep.Entities[i].Attributes["department"]; } if (entcolTep.Entities[i].Attributes.Contains("mobilephone")) { drTep["mobilephone"] = entcolTep.Entities[i].Attributes["mobilephone"]; } if (entcolTep.Entities[i].Attributes.Contains("telephone1")) { drTep["telephone1"] = entcolTep.Entities[i].Attributes["telephone1"]; } if (entcolTep.Entities[i].Attributes.Contains("parentcustomerid")) { drTep["parentcustomerid"] = ((EntityReference)entcolTep.Entities[i].Attributes["parentcustomerid"]).Name; } drTep["contactid"] = (Guid)entcolTep.Entities[i].Attributes["contactid"]; drTep["emailaddress1"] = entcolTep.Entities[i].Attributes["emailaddress1"]; dtContact.Rows.Add(drTep); } dtContact.AcceptChanges(); return dtContact; }
一、在Windows Azure中创建地缘组
“地缘组”是在您的 Windows Azure 订阅中对需要一起工作以便实现最佳性能的服务进行分组的方式。 简单点说,Windows Azure有很多数据中心,你所创建的VM有可能会运行在不同的数据中心的不同集群上。试想一下,如果你的SharePoint Farm的数据库服务器和App服务器分别运行的南美和东亚的数据中心,这时的性能肯定好不了。为能保证这两台VM能运行在同一个数据中心的同一个集群上,以提高性能,就需要有“地缘组”这样的一个东西能把你创建的VM打包成一个整体,并把这一个整体的服务同时运行在一个集群上。
1. 登录 Windows Azure 管理门户
2. 在左则导航栏选中设置
3. 地缘组 -> 添加
4. 输入名称、描述、数据中心,并点击确实
Note: 东亚数据中心在香港,推荐选东亚数据中心
二、在Windows Azure中创建存储账户
1. 登录 Windows Azure 管理门户
2. 在左则导航栏选中存储
3. 新建存储账户
4. 输入如下信息,创建存储账户
Note: 取消“启用地域复制”能提高性能,如在生产环境下,请保留
三、在Windows Azure中注册DNS服务
Windows Azure 中虚拟机的IP都是动态分配的,如果不注册DNS的话,它将使用Windows Azure默认提供的DNS服务, 动态为我们分配一个DNS。在东亚数据中心,它和DHCP是同一个服务器(168.63.129.16)。这对于我们搭建自己的AD,DNS,非常不利。通过注册DNS服务,Windows Azure将动态DNS指向我们指定的IP地址(10.0.0.4),而10.0.0.4就正好是我即将安装的DNS服务器的IP。Windows Azure默认为第一台机器分配.4 IP,所以在此注册的IP地址为10.0.0.4。
1. 登录 Windows Azure 管理门户
2. 在左则导航栏选中网络->DNS服务器->新建
3. 在左则导航栏选中网络->DNS服务器->新建,并输入如下信息,点击创建
四、创建虚拟网络
虚拟网络和我们在本地创建虚拟机时,创建的虚拟网络是一样的,主要是为了能将我们自己的vm放到同一个自定义的IP段。
1. 登录 Windows Azure 管理门户
2. 在左则导航栏选中网络->虚拟网络->新建
3. 新建->虚拟网络->自定义创建
4. 输入名称,地缘组
5. 选择已经注册的DNS服务
6. 选中”CIDR”,保持默认的IP地址
五、在 Windows Azure中创建虚拟机
1. 在左则导航栏选中虚拟机->虚拟机实例->新建
2. 选择从库中创建虚拟机
3. 选择SharePoint Server 2013 Trial
4. 输入如下信息,并继续
参照以上步骤,创建虚拟机: OffWebApp
名称 |
模板 |
DNS |
OffWebApp |
SQL Server 2012 SP1 Enterprise On Windows Server 2008 R2 SP1 |
OffWebApp2013. cloudapp.net |
创建完成后,虚拟机状态如下:
六、为Windows Azure VM附加额外硬盘(可选)
默认VM只有一个系统盘及一个临时数据盘(D盘),通过此操作可增加额外磁盘,以便存放数据库数据文件
1. 在Windows Azure 管理门户 附加磁盘(类似于给电脑添加新的物理磁盘)
2. 远程到服务器后,添加新磁盘并格式化
七、在Windows Azure VM中配置AD
1. 下载RDP文件,打开并远程连接到服务器(推荐使用Remote Desktop Connection Manager管理多台远程服务器)
2. 安装Active Directory Domain Services
安装完后,重启服务器,AD便已经安装成功.
参考: http://social.technet.microsoft.com/wiki/contents/articles/12370.step-by-step-guide-for-setting-up-windows-server-2012-domain-controller.aspx
3. 创建SharePoint 服务账户
- CONTOSO\spfarm – SharePoint Farm 管理员
- CONTOSO\sp_serviceapps – 运行SharePoint服务的账户
八、在Windows Azure VM中配置Sql Server 2012
由于这台OffWebApp VM的镜像中,已经预安装了Sql Server 2012了,故在此省略其安装步骤
1. 连接VM: OffWebApp
2. 启用命名管道
3. 修改默认的数据库数据文件,日志文件的路径
3.1. 在F盘新建如下目录
· F:\MSSQL Sql相关文件根目录
· F:\MSSQL\DATA Sql 数据文件目录
· F:\MSSQL\LOGS Sql日志文件目录
· F:\MSSQL\BACKUP Sql备件文件目录
3.2. 在 Sql管理器中设置默认文件路径
Note: 需要重启后,才能生效
4. 配置防火墙
5. 加入域: contoso.com
可能出现以下错误,可以忽略
6. 将域账户添加到Sql的管理员组
6.1. 用本机管理员: offwebapp\vmadmin登录(此时域管理员还没有权限操作数据库)
6.2. 将域管理员:contoso\vmadmin, SharePoint服务账户(contoso\spfarm,contoso\sp_serviceapps)加入sysadmin组
九、在Windows Azure VM中安装配置SharePoint 2013
由于VM本身已经预安装了SharePoint 2012,此处只需运行配置向导即可.
9.1 关闭“IE增强的安全配置”
9.2 运行配置向导
9.3 运行管理中心配置向导
访问http://sharepoint , 一切正常, SharePoint 2013安装完毕