Как разместить данные в Dynamics 365 с помощью HttpWebRequest - PullRequest
1 голос
/ 30 марта 2019

У меня есть требование для чтения данных из Dynamics 365 в режиме онлайн и для записи данных.

Поскольку мое приложение Target Framework является .Net Core 2.1, поэтому я не могу использовать Microsoft.Xrm.Sdk и решилвместо этого используйте Web API.

В моем коде я использую HttpWebRequest с методами "GET" и "POST", операция GET работает нормально и может получать записи из D365 с помощью веб-API.Когда я использую операцию POST, код выполняется правильно без каких-либо ошибок, но когда я перехожу к сущности D365, я не вижу ни одной вновь созданной записи.

Ниже мой код

Функция GetContactDetailsAsyncработает нормально и возвращает результат, но функция CreateCaseAsync не работает

public static async Task<string> GetContactDetailsAsync()
{
 string organizationUrl = "https://xxxxx.crmX.dynamics.com";
 string clientId = "xxxxxxxx-73aa-xxxx-94cc-8dc7941f6600";
 string appKey = "Xxxx81H/7TUFErt5C/xxxxxxxxxxxxxxxxxxxxxxx=";
 string aadInstance = "https://login.microsoftonline.com/";
 string tenantID = "xxxxxxxx.onmicrosoft.com";

        try
        {
            ClientCredential clientcred = new ClientCredential(clientId, appKey);
            AuthenticationContext authenticationContext = new AuthenticationContext(aadInstance + tenantID);

            AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(organizationUrl, clientcred);
            var requestedToken = authenticationResult.AccessToken;

            var webRequest = (HttpWebRequest)WebRequest.Create(new Uri("https://xxxxxxxxxx.api.crmx.dynamics.com/api/data/v9.1/contacts()?$select=fullname,contactid,emailaddress1&$filter=mobilephone eq '"+History.userMobile+"'"));
            webRequest.KeepAlive = false;
            webRequest.ServicePoint.ConnectionLimit = 1;

            webRequest.Method = "GET";
            webRequest.ContentLength = 0;
            webRequest.Headers.Add("Authorization", String.Format("Bearer {0}", requestedToken));
            webRequest.Headers.Add("OData-MaxVersion", "4.0");
            webRequest.Headers.Add("OData-Version", "4.0");
            webRequest.Accept = "application/json";
            webRequest.ContentType = "application/json";

            //if contact with user provided phone number found, ask for problem description
            try
            {
                using (var response1 = webRequest.GetResponse() as System.Net.HttpWebResponse)
                {
                    using (var reader = new System.IO.StreamReader(response1.GetResponseStream()))
                    {
                        var response = reader.ReadToEnd();
                    }
                }
            }
            catch (Exception ex)
            {
                History.isUserFound = false;
                string error = ex.Message;
                return "Sorry, I found that you are not using any of our services...";
            }
        }
        catch (Exception ex) { return ex.ToString(); }

    }




public static async void CreateCaseAsync()
        {
 string organizationUrl = "https://xxxxx.crmX.dynamics.com";
 string clientId = "xxxxxxxx-73aa-xxxx-94cc-8dc7941f6600";
 string appKey = "Xxxx81H/7TUFErt5C/xxxxxxxxxxxxxxxxxxxxxxx=";
 string aadInstance = "https://login.microsoftonline.com/";
 string tenantID = "xxxxxxxx.onmicrosoft.com";

        //trying to establish connection with D365 here
        try
        {
            ClientCredential clientcred = new ClientCredential(clientId, appKey);
            AuthenticationContext authenticationContext = new AuthenticationContext(aadInstance + tenantID);

            AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(organizationUrl, clientcred);
            var requestedToken = authenticationResult.AccessToken;

            var webRequest = (HttpWebRequest)WebRequest.Create(new Uri("https://xxxxxxxx.api.crmx.dynamics.com/api/data/v9.1/incidents"));
            webRequest.KeepAlive = false;
            webRequest.ServicePoint.ConnectionLimit = 1;

            webRequest.Method = "POST";
            webRequest.Headers.Add("Authorization", String.Format("Bearer {0}", requestedToken));
            webRequest.Headers.Add("OData-MaxVersion", "4.0");
            webRequest.Headers.Add("OData-Version", "4.0");
            webRequest.Accept = "application/json";
            webRequest.ContentType = "application/json";

            string json = "{\"title\":\"title by chat bot\"}";
            byte[] byteArray;
            byteArray = Encoding.UTF8.GetBytes(json);
            webRequest.ContentLength = byteArray.Length;

            try
            {
                Stream requestDataStream = await webRequest.GetRequestStreamAsync();
                requestDataStream.Write(byteArray, 0, byteArray.Length);
                requestDataStream.Close();
            }
            catch (Exception ex) { }
        }

        catch (Exception ex) { }

    }

Я попытался изменить string json = "{\"title\":\"title by chat bot\"}" на "{'title':'title by chat bot'}" и "{title:title by chat bot}".

Также у меня естьпопытался изменить Stream requestDataStream = await webRequest.GetRequestStreamAsync(); на Stream requestDataStream = webRequest.GetRequestStream();, но ничего не получилось.

Невозможно определить, что мне не хватает в моем коде.Любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 01 апреля 2019

Вот код для Webapi, использующий Javascript. Я только что попробовал приведенный ниже код в своей организации, и он сработал для меня.

var entity = {};
entity.title = "CCCCAAAASSSEEEE";

var req = new XMLHttpRequest();
req.open("PATCH", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/incidents(BA8BC3CD-D94F-E911-A82F-000D3A385A1C)", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function() {
    if (this.readyState === 4) {
        req.onreadystatechange = null;
        if (this.status === 204) {
            //Success - No Return Data - Do Something
        } else {
            Xrm.Utility.alertDialog(this.statusText);
        }
    }
};
req.send(JSON.stringify(entity));

и ниже ссылка, где вы можете найти, как именно использовать метод PATCH для CRM, используя c #

https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/webapi/web-api-functions-actions-sample-csharp

0 голосов
/ 30 марта 2019

На самом деле код выглядит нормально, но вы должны получить исключение 400 Bad request.Поскольку в json отсутствует customerid, а базовая полезная нагрузка для создания инцидента должна быть такой, как показано ниже:

{
  "title": "title by chat bot",
  "customerid_account@odata.bind": "/accounts(f686f062-e542-e811-a955-000d3ab27a43)"
}

Для ясности вы можете сослаться на этот поток SO .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...