You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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。

操作步骤:

  1. 替换NuGet包:移除Microsoft.CrmSdk.XrmTooling.CoreAssembly,安装Microsoft.PowerPlatform.Dataverse.Client(选择最新稳定版即可)。
  2. 初始化客户端:通过连接字符串创建ServiceClient对象(注意此为Microsoft.PowerPlatform.Dataverse.Client.ServiceClient,而非旧XrmTooling中的同名类)。
  3. 执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:55:29