Файл метаданных Business Central генерирует некорректные маршруты APi с помощью службы подключения OData Visual Studio - PullRequest
0 голосов
/ 02 марта 2020

У меня есть демонстрационный клиент в Dynamics Business Central, и я работаю с OData, чтобы создавать примеры CRUD для сущности компании, а после этого - для счетов-фактур, предложений, заказов, продуктов и других. Я загрузил файл метаданных, используя этот URL-вызов: https://api.businesscentral.dynamics.com/v2.0/ {tenantid} / Production / ODataV4 / $ metadata

Маркер доступа предоставляется с использованием IConfidentialClientApplication и AuthenticationResult. Токен правильный, и я могу получить список компаний из Business Central при его использовании в почтальоне.

Я передаю токен при каждом вызове оддаты следующим образом:

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");
        }
    }

Это код моего вызова OData компании GET:

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

Почтальон возвращает ошибку 404 с этим URL: 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 с правильными значениями компании.

1 Ответ

0 голосов
/ 03 марта 2020

Метод AcquireTokenOnBehalfOf для получения AuthenticationResult не возвращает слово «Носитель» с токеном доступа в Business Central, слово «Носитель» возвращается при получении токена для службы поддержки клиентов CRM, поэтому я не думал, что возникнут проблемы есть.

...