c# - 如何使用 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();
但没有任何效果。
无法弄清楚我的代码中缺少什么。任何帮助都是高度赞赏的。
解决方案
实际上代码看起来不错,但你应该得到 400 Bad request 异常。因为缺少 jsoncustomerid
并且创建事件的基本有效负载应如下所示:
{
"title": "title by chat bot",
"customerid_account@odata.bind": "/accounts(f686f062-e542-e811-a955-000d3ab27a43)"
}
为了清楚起见,您可以参考此SO 线程。
推荐阅读
- python - Pandas - 如何将“hh:mm:ss PM”字符串转换为 24 小时时间戳
- python - 使用 Pymongo 调用 Mongodb 原生方法
- java - Systemd 强制执行目录
- javascript - 如何在 Webpack bundle js 中保护我的静态网站的敏感数据
- math - 协助编写指数衰减公式
- pandas - 如何使用 Dataframe 从列中删除“₦”货币
- regex - 具有联合结果的递归正则表达式
- c# - WPF 中的最小化窗口无法通过在 WIndows 任务栏中拖动数据对象来恢复
- regex - 正则表达式:为什么这不能捕获多个双字母出现?
- batch-file - 批处理脚本 - 将在一个目录中找到的所有文件写入一个命令行?