需要在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. 新建存储账户