需要在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 = "jasondct@microsoft.com"; \\这里是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("jasondct@163.com", 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;
}
下面是详细介绍了如何在Azure 安装 Sharepoint 2013 系统
一、在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地址
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便已经安装成功.
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安装完毕