.NET 6 Lambda中用CrmServiceClient遇程序集加载问题,求替代Xrm API
解决.NET 6 Lambda中Dynamics CRM/Dataverse CRUD兼容问题
你遇到的错误确实是因为Microsoft.CrmSdk.XrmTooling.CoreAssembly依赖.NET Framework专属的System.ServiceModel组件,而.NET 6 Lambda的跨平台环境不包含该组件,导致加载失败。以下是两种兼容的替代方案:
推荐方案:使用Microsoft.PowerPlatform.Dataverse.Client
这是微软官方推出的适配.NET Core/.NET 6+的Dataverse客户端库,完全替代旧的XrmTooling组件,跨平台兼容Lambda环境,底层基于Dataverse Web API实现,无需依赖System.ServiceModel。
操作步骤:
- 替换NuGet包:移除
Microsoft.CrmSdk.XrmTooling.CoreAssembly,安装Microsoft.PowerPlatform.Dataverse.Client(选择最新稳定版即可)。 - 初始化客户端:通过连接字符串创建
ServiceClient对象(注意此为Microsoft.PowerPlatform.Dataverse.Client.ServiceClient,而非旧XrmTooling中的同名类)。 - 执行CRUD操作:API用法与旧版类似,适配.NET 6特性。
代码示例:
初始化客户端
using Microsoft.PowerPlatform.Dataverse.Client; using Microsoft.Xrm.Sdk; var connectionString = "AuthType=ClientSecret;Url=https://your-org.crm.dynamics.com;ClientId=your-client-id;ClientSecret=your-client-secret"; var serviceClient = new ServiceClient(connectionString); if (!serviceClient.IsReady) { throw new Exception($"连接失败: {serviceClient.LastError.Message}"); }
创建记录
var account = new Entity("account"); account["name"] = "测试账户"; account["emailaddress1"] = "test@example.com"; var accountId = serviceClient.Create(account);
查询记录
using Microsoft.Xrm.Sdk.Query; var query = new QueryExpression("account") { ColumnSet = new ColumnSet("name", "emailaddress1"), Criteria = new FilterExpression() { Conditions = { new ConditionExpression("name", ConditionOperator.Equal, "测试账户") } } }; var results = serviceClient.RetrieveMultiple(query); foreach (var entity in results.Entities) { Console.WriteLine($"账户名称: {entity["name"]}, 邮箱: {entity["emailaddress1"]}"); }
更新记录
var updatedAccount = new Entity("account", accountId); updatedAccount["name"] = "更新后的账户名称"; serviceClient.Update(updatedAccount);
删除记录
serviceClient.Delete("account", accountId);
备选方案:直接调用Dataverse Web API
如果对包体积有严格要求,可直接用HttpClient调用Dataverse的REST接口,完全不依赖任何Xrm SDK组件,轻量化适配Lambda场景。
示例:获取令牌并创建记录
using System.Net.Http.Headers; using System.Text.Json; // 1. 获取OAuth令牌 var tokenClient = new HttpClient(); var tokenRequest = new Dictionary<string, string> { ["grant_type"] = "client_credentials", ["client_id"] = "your-client-id", ["client_secret"] = "your-client-secret", ["resource"] = "https://your-org.crm.dynamics.com" }; var tokenResponse = await tokenClient.PostAsync("https://login.microsoftonline.com/your-tenant-id/oauth2/token", new FormUrlEncodedContent(tokenRequest)); var tokenContent = await tokenResponse.Content.ReadFromJsonAsync<JsonElement>(); var accessToken = tokenContent.GetProperty("access_token").GetString(); // 2. 调用Web API创建账户 var dataverseClient = new HttpClient(); dataverseClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); dataverseClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); dataverseClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0"); dataverseClient.DefaultRequestHeaders.Add("OData-Version", "4.0"); var accountData = new { name = "测试账户", emailaddress1 = "test@example.com" }; var createResponse = await dataverseClient.PostAsJsonAsync("https://your-org.crm.dynamics.com/api/data/v9.2/accounts", accountData); createResponse.EnsureSuccessStatusCode();
内容的提问来源于stack exchange,提问作者MAK
相关产品推荐
相关产品推荐

