Dynamics 2011 OrganizationServiceProxy身份验证

时间:2011-09-20 22:15:43

标签: .net dynamics-crm dynamics-crm-2011

我们有一个安装程序(vdproj msi),它使用OrganizationServiceProxy安装Dynamics 2011托管软件包(作为嵌入式资源存储的zip文件)。它按如下方式构造OrganizationServiceProxy:

var organizationUri = new Uri(string.Format(
  ORGANIZATION_SERVICE_URI_TEMPLATE, configuration.WebServiceUrl, 
  configuration.CrmOrganizationName));

var credentials = new ClientCredentials();
credentials.Windows.ClientCredential = GetNetworkCredentials();

credentials.UserName.UserName = credentials.Windows.ClientCredential.UserName;
credentials.UserName.Password = credentials.Windows.ClientCredential.Password;

var client = new OrganizationServiceProxy(organizationUri, null, credentials, null)
  { Timeout = TimeSpan.FromMilliseconds(WEB_SERVICE_TIMEOUT) };

return client;

执行ImportSolutionRequest

var importSolutionRequest = new ImportSolutionRequest
{
  CustomizationFile = Resources.DynamicsSolution,
  ImportJobId = Guid.NewGuid()
};
service.Execute(importSolutionRequest);

这会产生奇妙的错误:

  

WebI服务插件在OrganizationId中失败:510c06a3-6ee9-43a7-ba54-677054348813; SdkMessageProcessingStepId:1b830950-e106-4ee1-b3fd-d348cb65dc8d; EntityName:无;阶段:30; MessageName:ImportSolution; AssemblyName:Microsoft.Crm.Extensibility.InternalOperationPlugin,Microsoft.Crm.ObjectModel,Version = 5.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35; ClassName:Microsoft.Crm.Extensibility.InternalOperationPlugin;异常:未处理的异常:System.Reflection.TargetInvocationException:调用的目标抛出了异常。          在System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo方法,Object target,Object []参数,SignatureStruct& sig,MethodAttributes methodAttributes,RuntimeType typeOwner)          at System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object [] parameters,CultureInfo culture,Boolean skipVisibilityChecks)          在System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化)          在System.Web.Services.Protocols.LogicalMethodInfo.Invoke(Object target,Object [] values)          在Microsoft.Crm.Extensibility.InternalOperationPlugin.Execute(IServiceProvider serviceProvider)          在Microsoft.Crm.Extensibility.V5PluginProxyStep.ExecuteInternal(PipelineExecutionContext context)          在Microsoft.Crm.Extensibility.VersionedPluginProxyStepBase.Execute(PipelineExecutionContext context)       内部异常:System.Globalization.CultureNotFoundException:不支持Culture。       参数名称:culture       0(0x0000)是无效的区域性标识符。          在System.Globalization.CultureInfo.InitializeFromCultureId(Int32 culture,Boolean useUserOverride)          在Microsoft.Crm.Tools.ImportExportPublish.SolutionPackageUpgrade..ctor(ExecutionContext context)          在Microsoft.Crm.Tools.ImportExportPublish.RootImportHandler..ctor(ImportXml parent,Boolean overwriteUnmanagedCustomizations,Boolean publishWorkflows,Byte [] compressedCustomizationFile,Boolean setup,Version existingDatabaseVersion,ExecutionContext context,Boolean extractAllFiles)          at Microsoft.Crm.Tools.ImportExportPublish.ImportXml..ctor(Boolean overwriteUnmanagedCustomizations,Boolean publishWorkflows,Byte [] compressedCustomizationFile,Guid importJobId,Boolean convertToManaged,ExecutionContext context)          at Microsoft.Crm.WebServices.ImportXmlService.ImportSolution(Boolean overwriteUnmanagedCustomizations,Boolean publishWorkflows,Byte [] customizationFile,Guid importJobId,Boolean convertToManaged,ExecutionContext context)

经过几个小时的研究和反汇编Microsoft Dynamics内部dll(如果不是那么悲伤我会这么做会很有趣),我发现传入请求的ExecutionContext中的CallerId是空的(即使请求使用提供的凭据进行身份验证。

所以,我从SystemUser表中查找了想要使用的SystemUserId并指定了

client.CallerId = Guid.Parse("94DB2FFC-DBDE-E011-95D5-005056AF0052");

请注意,ImportSolutionRequest在执行此操作后成功。

我留下了问题:

  1. 有没有另一种方法来完成这个荒谬的基本任务而不指定实际有效的CallerId?没有它,为什么它不起作用?
  2. 如果没有,我如何根据我提供的凭据(无需对其进行硬编码)让callerId在OrganizationServiceProxy上设置。
  3. 为什么我在全新服务器上全新默认安装Dynamics时遇到这些问题?

1 个答案:

答案 0 :(得分:1)

我没有太多以编程方式导入解决方案的经验,因此我无法回答1.对于问题2,我认为您可以使用WhoAmIRequest。至于3,我不确定在得到1的答案之前我将其归类为问题。:)