Dynamics CRM - 获取组织服务

Plugin


using Microsoft.Crm.Sdk.Messages;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;

namespace Company.Plugin.LogicalRepository
{
    public class Account:IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            //获取执行上下文
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            //获取服务工厂实例
            IOrganizationServiceFactory factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            //获取管理员组织服务实例
            IOrganizationService serviceAdmin = factory.CreateOrganizationService(null);// 该情况获取只针对于 沙盒模式注册的插件有效 
            if (serviceAdmin is OrganizationServiceProxy proxy)// 非沙盒模式 添加
            {
                proxy.CallerId = new Guid();
            }
            
            //获取当前个人组织服务实例
            IOrganizationService service = factory.CreateOrganizationService(context.UserId);
            // 获取调试服务
            ITracingService tracing = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            // 获取组织服务上下文
            OrganizationServiceContext orgContext = new OrganizationServiceContext(serviceAdmin);
        }
    }
}

WorkFlow

using System;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Workflow;
using System.Activities;
using Microsoft.Xrm.Sdk.Query;

namespace Company.WorkFlow.Opportunity
{
    public class OpportunityWarn : CodeActivity
    {
        // 输入参数 (可省)
        [Input("userid")]
        public InArgument<string> userid { get; set; }
        [Input("accountid")]
        public InArgument<string> yzid { get; set; }
        // 输出参数(可省)
        [Output("flag")]
        public OutArgument<bool> flag { get; set; }
        
        protected override void Execute(CodeActivityContext context)
        {
            // 获取服务
            IWorkflowContext workcontext = context.GetExtension<IWorkflowContext>();
            IOrganizationServiceFactory factory = context.GetExtension<IOrganizationServiceFactory>();
            IOrganizationService serviceAdmin = factory.CreateOrganizationService(null);
            IOrganizationService service = factory.CreateOrganizationService(workcontext.UserId);
            
            try
            {
                // 获取输入参数
                var userId = userid.Get<string>(context).ToLower();
                var accountId = accountid.Get<string>(context);
                bool output = true;
                // 设置输出参数
                flag.Set(context, output);
              
            }
            catch(Exception ex)
            {
                throw new NotImplementedException(ex.Message);
            }
        }
    }
}

JOB (读取XML配置文件获取组织服务)

1. 设置配置文件 CRMConfig.xml

<CRMConfig description="SavePath C:\CRMConfig\">
	<CRMServiceUrl description="CRM Application URL">https://xxxx.xxxx.cn</CRMServiceUrl>
	<CRMOrganizationName description="CRM Organization Name">组织名</CRMOrganizationName>
	<CRMUserDomainName description="CRM Administrator Belong To Domain Name">域名</CRMUserDomainName>
	<CRMUserName description="CRM Administrator Name">部署管理员账号</CRMUserName>
	<CRMUserPassword description="CRM Administrator Password">密码</CRMUserPassword>
  	<CRMAuthenticationType description="CRM Authentication Type:AD or ADFS">AD</CRMAuthenticationType>
	<CRMSqlConnStr description="CRM SQL Server Connection String">Data Source=具体IP地址;Initial Catalog=数据库名称;User ID=登录账号;Pwd=密码;</CRMSqlConnStr>
	<LogPath description="LogPath">日志记录路径</LogPath>
</CRMConfig>

2. 读取配置文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace Company.Crm.Helper
{
    public class CRMConfigHelper
    {
        public static CRMConfig InitialCRMConfig(string crmOrganizationName)
        {
            CRMConfig crmConfig = new CRMConfig();
            try
            {
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load("C:\\CRMConfig\\" + crmOrganizationName + "Config.xml");
                XmlNode ConfigNode = xmlDoc.SelectSingleNode("/CRMConfig");

                string crmServiceUrl = string.Empty;
                if (ConfigNode["CRMServiceUrl"] != null)
                {
                    crmServiceUrl = ConfigNode["CRMServiceUrl"].InnerText.Trim();
                    if (crmServiceUrl.EndsWith("/"))
                    {
                        crmServiceUrl = crmServiceUrl.Substring(0, crmServiceUrl.Length - 1);
                    }
                }
                crmConfig.CRMServiceUrl = crmServiceUrl;
                crmConfig.CRMOrganizationName = ConfigNode["CRMOrganizationName"] != null ? ConfigNode["CRMOrganizationName"].InnerText.Trim() : string.Empty;
                crmConfig.CRMUserDomainName = ConfigNode["CRMUserDomainName"] != null ? ConfigNode["CRMUserDomainName"].InnerText.Trim() : string.Empty;
                crmConfig.CRMUserName = ConfigNode["CRMUserName"] != null ? ConfigNode["CRMUserName"].InnerText.Trim() : string.Empty;
                crmConfig.CRMUserPassword = ConfigNode["CRMUserPassword"] != null ? ConfigNode["CRMUserPassword"].InnerText.Trim() : string.Empty;
                crmConfig.CRMAuthenticationType = ConfigNode["CRMAuthenticationType"] != null ? ConfigNode["CRMAuthenticationType"].InnerText.Trim() : string.Empty;
                crmConfig.CRMSqlConnStr = ConfigNode["CRMSqlConnStr"] != null ? ConfigNode["CRMSqlConnStr"].InnerText.Trim() : string.Empty;
                crmConfig.LogPath = ConfigNode["LogPath"] != null ? ConfigNode["LogPath"].InnerText.Trim() : string.Empty;
            }
            catch (Exception ex)
            {
                throw new Exception("Initial CRM Config Error : " + ex.Message);
            }

            return crmConfig;
        }

        [Serializable]
        public class CRMConfig
        {
            private string crmServiceUrl;
            private string crmOrganizationName;
            private string crmUserDomainName;
            private string crmUserName;
            private string crmUserPassword;
            private string crmAuthenticationType;
            private string crmSqlConnStr;
            private string logPath;

            public string CRMServiceUrl
            {
                get { return crmServiceUrl; }
                set { crmServiceUrl = value; }
            }

            public string CRMOrganizationName
            {
                get { return crmOrganizationName; }
                set { crmOrganizationName = value; }
            }

            public string CRMUserDomainName
            {
                get { return crmUserDomainName; }
                set { crmUserDomainName = value; }
            }

            public string CRMUserName
            {
                get { return crmUserName; }
                set { crmUserName = value; }
            }

            public string CRMUserPassword
            {
                get { return crmUserPassword; }
                set { crmUserPassword = value; }
            }

            public string CRMAuthenticationType
            {
                get { return crmAuthenticationType; }
                set { crmAuthenticationType = value; }
            }

            public string CRMSqlConnStr
            {
                get { return crmSqlConnStr; }
                set { crmSqlConnStr = value; }
            }

            public string LogPath
            {
                get { return logPath; }
                set { logPath = value; }
            }
        }
    }

}

3. 初始化组织服务

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Description;
using System.Text;

namespace Company.Crm.Helper
{
    public class CRMServiceHelper
    {
        public static IOrganizationService InitialCRMService(string crmServiceUrl, string crmOrganizationName, string crmAuthenticationType, string crmUserName, string crmUserPassword, string crmUserDomainName)
        {
            IOrganizationService crmService = null;
            try
            {
                Uri orgServiceUri = new Uri(crmServiceUrl + "/" + crmOrganizationName + "/XRMServices/2011/Organization.svc");

                ClientCredentials credentials = new ClientCredentials();
                if (crmAuthenticationType == "AD")
                {
                    credentials.Windows.ClientCredential = new System.Net.NetworkCredential(crmUserName, crmUserPassword, crmUserDomainName);
                }
                else if (crmAuthenticationType == "ADFS")
                {
                    credentials.UserName.UserName = crmUserDomainName + "\\" + crmUserName;
                    credentials.UserName.Password = crmUserPassword;
                }
                OrganizationServiceProxy crmServiceProxy = new OrganizationServiceProxy(orgServiceUri, null, credentials, null);
                crmService = (IOrganizationService)crmServiceProxy;
            }
            catch (Exception ex)
            {
                throw new Exception("Initial CRM Service Error : " + ex.Message);
            }
            return crmService;
        }
    }
}

4. 代码中初始化组织服务

     // 获取CRM组织的 Config
     CRMConfigHelper.CRMConfig crmConfig = CRMConfigHelper.InitialCRMConfig(crmOrganizationName);
     
     // 初始化CRM的WebService
     IOrganizationService crmService = CRMServiceHelper.InitialCRMService(crmConfig.CRMServiceUrl, crmConfig.CRMOrganizationName,
         crmConfig.CRMAuthenticationType, crmConfig.CRMUserName, crmConfig.CRMUserPassword, crmConfig.CRMUserDomainName);

Web Api(读取网站confige文件配置)

1. 在web.confige中添加配置

在web.config中的configuration中添加如下

 <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <!-- 环境地址 -->
    <add key="OrgUrl" value="dpVIRl+QssCBVYXgC4SSY0MmpZryp0T+SYbqv/iBMxsl/5aAMpZoN7xGTrcXnibL9YTNVA6uyILjUuYfHhyu+eHaOy5fY1OWHisw108JJLU="/>
    <add key="Domain" value="zzk1esy1qoU=" />
    <add key="UserName" value="7GzyExOV+by4bwd0MHXb0A==" />
    <add key="PassWord" value="gGsQIvjb3p6qYBA87CQfjQ==" />
    <add key="IFD" value="/95Qsp2+0M8=" />
    <add key="ApiDomain" value="****************" />
  </appSettings>
  <connectionStrings>
    <add name="crm" connectionString="Url=组织服务的地址; Username=name; Password=psd" />
    <add name="CRMData" connectionString="Data Source=IP地址;Initial Catalog=数据库名称;User ID=sa;Password=密码" providerName="System.Data.SQLClient" />
  </connectionStrings>

考虑到安全性,可对配置的属性进行加密,解密在获取相关配置实例化服务的时候

2. 获取配置

        private readonly static string Domain = EasyEncript.Decrypt(ConfigurationManager.AppSettings["Domain"], EasyEncript.PwdKey);// ConfigurationManager.AppSettings["Domain"];
        private readonly static string UserName = EasyEncript.Decrypt(ConfigurationManager.AppSettings["UserName"], EasyEncript.PwdKey);//ConfigurationManager.AppSettings["UserName"];
        private readonly static string PassWord = EasyEncript.Decrypt(ConfigurationManager.AppSettings["PassWord"], EasyEncript.PwdKey);// ConfigurationManager.AppSettings["PassWord"];
        private static string baseUrl = ConfigurationManager.AppSettings["OrgUrl"];
        private readonly static string OrganizationUri = EasyEncript.Decrypt(baseUrl, EasyEncript.PwdKey); // ConfigurationManager.AppSettings["OrgUrl"];
        private readonly static string IFD = EasyEncript.Decrypt(ConfigurationManager.AppSettings["IFD"], EasyEncript.PwdKey);//ConfigurationManager.AppSettings["IFD"];

其中 EasyEncript.Decrypt 是解密的函数 ; EasyEncript.PwdKey 是密钥

3. 实例化组织服务


        public static OrganizationServiceProxy GetService(string OURL, string UserName, string PassWord, string Domain)
        {
            OrganizationServiceProxy organizationServiceProxy = null;           
            try
            {
                if (organizationServiceProxy == null)
                {
                    ClientCredentials clientCredentials;
                    clientCredentials = new ClientCredentials
                    {
                        UserName = { UserName = UserName, Password = PassWord }
                        //Windows = { ClientCredential = new NetworkCredential(UserName, PassWord, Domain) }
                    };
                    organizationServiceProxy = new OrganizationServiceProxy(new Uri(OURL), null, clientCredentials, null);
                }
                return organizationServiceProxy;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
        private static OrganizationServiceProxy organizationServiceProxy = null;
        private static OrganizationServiceProxy organizationServiceForuser = null;
        /// <summary>
        /// 管理员组织服务
        /// </summary>
        /// <returns></returns>
        public static OrganizationServiceProxy OrganizationServiceAdmin()
        {
            return CrmService.GetService(OrganizationUri, UserName, PassWord, Domain);
        }
         /// <summary>
        /// 个人组织服务
        /// </summary>
        /// <param name="_userId"></param>
        /// <returns></returns>
        public static OrganizationServiceProxy OrganizationServiceForUser(Guid _userId)
        {
            organizationServiceForuser = GetService(OrganizationUri, UserName, PassWord, Domain);
            organizationServiceForuser.CallerId = _userId;
            organizationServiceForuser.CallerRegardingObjectId = _userId;
            return organizationServiceForuser;
        }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mu_sang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值