【问题标题】:D365 FO connection from windows forms C# application来自 Windows 窗体 C# 应用程序的 D365 FO 连接
【发布时间】:2022-01-03 05:07:09
【问题描述】:

我需要从 C# Windows 窗体应用程序连接到本地 D365 FO。

到目前为止,我创建了一个 Azure 帐户并注册了一个应用程序,所以现在我有了“应用程序(客户端)ID”、“目录(租户)ID”并创建了一个客户端密码。

我需要做什么才能使用数据管理包 REST API 连接到 D365 FO?

【问题讨论】:

    标签: dynamics-365 dynamics-365-operations


    【解决方案1】:

    查看Authorization Helper,它是Microsoft 为数据管理API 提供的示例控制台应用程序的一部分(参见https://docs.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/data-entities/data-management-api 中的最后一句)。应用程序的Program.cs 显示了如何使用身份验证助手。

    AuthorizationHelper.cs

    using Microsoft.IdentityModel.Clients.ActiveDirectory;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace AuthorizationHelper
    {
        public class AuthorizationHelper
        {
            const string aadTenant = "https://login.windows.net/<your-tenant>";
            public const string aadResource = "https://<yourAOS>.cloudax.dynamics.com";
            const string aadClientAppId = "<client id>";        
            const string aadClientAppSecret = "<client secret>";
    
            /// <summary>
            /// Retrieves an authentication header from the service.
            /// </summary>
            /// <returns>The authentication header for the Web API call.</returns>
            public static string GetAuthenticationHeader()
            {
                AuthenticationContext authenticationContext = new AuthenticationContext(aadTenant);
                AuthenticationResult authenticationResult;
                
                var creadential = new ClientCredential(aadClientAppId, aadClientAppSecret);
                authenticationResult = authenticationContext.AcquireTokenAsync(aadResource, creadential).Result;
                
                // Create and get JWT token
                return authenticationResult.CreateAuthorizationHeader();
            }
        }
    }
    

    程序.cs

    using ODataClient.Microsoft.Dynamics.DataEntities;
    using System;
    
    namespace DataPackageHandler
    {
        using AuthorizationHelper;
        using Microsoft.OData.Client;
    
        class Program
        {
            static void Main(string[] args)
            {
                string ODataEntityPath = AuthorizationHelper.aadResource + "/data";
                Uri oDataUri = new Uri(ODataEntityPath, UriKind.Absolute);
    
                var d365Client = new Resources(oDataUri);
                d365Client.SendingRequest2 += new EventHandler<SendingRequest2EventArgs>(delegate (object sender, SendingRequest2EventArgs e)
                {
                    var authenticationHeader = AuthorizationHelper.GetAuthenticationHeader();
                    e.RequestMessage.SetHeader("Authorization", authenticationHeader);
                });
    
                PackageImporter.ImportPackage(d365Client, @"..\debug\SampleData\usmf_asset-major-types-01.zip");
                PackageExporter.ExportPackage(d365Client, @"..\debug\SampleData\");
    
                Console.WriteLine("Press enter to exit...");
                Console.ReadLine();
            }        
        }
    }
    

    【讨论】:

    • 谢谢FH。提供的解决方案似乎基于 OData。 docs.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/… 表示“对于本地部署,唯一支持的 API 是数据管理包 REST API”。这种方法是否仍然适用于可以在交互式和预定全自动模式下运行的 Windows 窗体应用程序?
    • 另外,我找不到 Microsoft.OData.Client、Microsoft.Dynamics.DataEntities 和 Microsoft.IdentityModel.Clients.ActiveDirectory - 请告知需要在我的桌面上安装什么。谢谢。
    • 我建议您熟悉一下 D365 FO 开发的一般要求:docs.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/… 如果您还有其他问题,请创建一个新问题。
    • FH,谢谢你的参考,很有帮助。有两个主要问题:许多旧代码示例引用了旧版 ADAL 身份验证而不是当前的 MSAL,并且随着时间的推移,许多方法更改了它们的签名。 AuthenticationContext 的构造函数曾经接受参数,但现在不再接受了。AuthorizationHelper 类中引用的 Microsoft.IdentityModel.Clients.ActiveDirectory 似乎具有更新版本的 Microsoft.Identity.Client。我找不到使 Microsoft.IdentityModel.Clients.ActiveDirectory 被识别的当前包。任何建议将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多