首页 > 解决方案 > 如何使用 HttpWebRequest 在 Dynamics 365 中发布数据

问题描述

我需要从 Dynamics 365 在线读取数据并写入数据。

由于我的应用程序目标框架是 .Net Core 2.1,所以我无法使用 Microsoft.Xrm.Sdk 并决定改用 Web api。

在我的代码中,我使用带有“GET”和“POST”方法的 HttpWebRequest,GET 操作工作正常,并且能够使用 web api 从 D365 检索记录。当我使用 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();但没有任何效果。

无法弄清楚我的代码中缺少什么。任何帮助都是高度赞赏的。

标签: c#.net-coredynamics-crmmicrosoft-dynamics

解决方案


实际上代码看起来不错,但你应该得到 400 Bad request 异常。因为缺少 jsoncustomerid并且创建事件的基本有效负载应如下所示:

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

为了清楚起见,您可以参考此SO 线程


推荐阅读