0

我有一个使用 Dynamics Business Central 的演示租户,我正在使用 OData 为公司实体制作 CRUD 示例,之后它适用于发票、报价单、订单、产品等。我已使用此 URL 调用下载了元数据文件:https : //api.businesscentral.dynamics.com/v2.0/ {tenantid}/Production/ODataV4/$metadata

访问令牌是使用 IConfidentialClientApplication 和 AuthenticationResult 提供的。令牌是正确的,在邮递员中使用它时,我可以从 Business Central 获取公司列表。

我在每个 odata 调用中传递令牌,如下所示:

myNAV.NAV bcContext = new myNAV.NAV(new Uri("https://api.businesscentral.dynamics.com/v1.0/api/beta/"));
bcContext.SendingRequest2 += new EventHandler<SendingRequest2EventArgs>((sender, e) => oDataExtension.OnSendingRequest(sender, e, crmAuthResult.AccessToken));
public class oDataExtension
    {

        public const string POSTLocationHeaderException = "The response to this POST request did not contain a 'location' header. That is not supported by this client.";

        public static void OnSendingRequest(object sender, SendingRequest2EventArgs e, string token)
        {
            // Add an Authorization header that contains an OAuth WRAP access token to the request.
            e.RequestMessage.SetHeader("Authorization", token);
            //if (e.RequestMessage.Method.Equals("PUT", System.StringComparison.InvariantCultureIgnoreCase))
            //{
            //    //e.RequestMessage.Method = "PATCH";

            //}
            if (!e.RequestMessage.Method.Equals("POST", System.StringComparison.InvariantCultureIgnoreCase) && !e.RequestMessage.Method.Equals("PATCH", System.StringComparison.InvariantCultureIgnoreCase))
            {
                e.RequestMessage.SetHeader("Prefer", "odata.include-annotations=\"*\"");
            }

            e.RequestMessage.SetHeader("accept-language", "en-US,en;q=0.9,hr;q=0.8");
        }
    }

这是我的 GET Company OData 调用的代码:

List<myNAV.Company> customQuotes = (await ((DataServiceQuery<myNAV.Company>)bcContext.Company).ExecuteAsync()).ToList();

代码生成的 URL 如下所示:https ://api.businesscentral.dynamics.com/v1.0/api/beta/company

但正确的 URL 应如下所示:https ://api.businesscentral.dynamics.com/v1.0/api/beta/companies

Postman 使用此 url 返回错误 404:https ://api.businesscentral.dynamics.com/v1.0/api/beta/company ,但 DataServiceQuery 中的相同调用返回错误 401,凭据不正确。

从不同的 url(https://api.businesscentral.dynamics.com/v1.0/api/beta $metadata#)获取元数据文件后,查询生成正确的 url,但我仍然收到我使用不正确凭据的错误但是当我在邮递员中使用 URL 和访问令牌时,它会返回 200 Success 和正确的公司值。

4

1 回答 1

0

获取 AuthenticationResult 的 AcquireTokenOnBehalfOf 方法不会在 Business Central 中返回带有 Access Token 的单词“Bearer”,当您为 CRM 客户服务获取令牌时会返回单词“Bearer”,所以我认为那里不会有问题。

于 2020-03-03T12:55:27.657 回答