我有一个使用 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 和正确的公司值。