这是使用 Microsoft 示例对 CRM 进行身份验证的代码:
public class CrmConnector
{
private const string ApiVersion = "v8.2";
public static HttpClient Client { get; set; }
public CrmConnector(FileConfiguration config)
{
if (Client == null)
{
Task.WaitAll(Task.Run(async () => await ConnectToCRM(config)));
}
}
/// <summary>
/// Obtains the connection information from the application's configuration file, then
/// uses this info to connect to the specified CRM service.
/// </summary>
protected virtual async Task ConnectToCRM(Configuration config)
{
Authentication auth = new Authentication(config);
Client = new HttpClient(auth.ClientHandler, true);
Client.BaseAddress = new Uri($"{config.ServiceUrl}api/data/{ApiVersion}/");
Client.Timeout = new TimeSpan(0, 2, 0);
Client.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0");
Client.DefaultRequestHeaders.Add("OData-Version", "4.0");
Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
}
要传递配置文件,将如下所示:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<connectionStrings>
<clear />
<!-- When providing a password, make sure to set the app.config file's security so that only you can read it. -->
<add name="default" connectionString="Url=ORG; Username=USER; Password=PASS; Domain=DOMAIN" />
<add name="CrmOnline" connectionString="Url=https://mydomain.crm.dynamics.com/; Username=someone@mydomain.onmicrosoft.com; Password=password" />
</connectionStrings>
<appSettings>
<!--For information on how to register an app and obtain the ClientId and RedirectUrl
values see https://msdn.microsoft.com/dynamics/crm/mt149065 -->
<!--Active Directory application registration. -->
<!--These are dummy values and should be replaced with your actual app registration values.-->
<add key="ClientId" value="CLIENTID" />
<!--<add key="RedirectUrl" value="http://localhost/SdkSample" />-->
<!-- Use an alternate configuration file for connection string and setting values. This optional setting
enables use of an app.config file shared among multiple applications. If the specified file does
not exist, this setting is ignored.-->
<add key="AlternateConfig" value="C:\Temp\crmsample.exe.config"/>
</appSettings>
</configuration>
您可以从组织中的开发人员资源中获取您的 clientId,redirectUrl 是可选的,您可以像这样使用该对象:
CrmConnector CrmConnector = new CrmConnector(new FileConfiguration(null));
并提出请求:
public const string OdataAnnotationAll = "odata.include-annotations=*";
protected virtual async Task<HttpResponseMessage> RequestCRMAsync(HttpMethod method, string query, string pag, bool annotations)
{
HttpRequestMessage request = new HttpRequestMessage(method, query);
request.Headers.Add("Prefer", "odata.maxpagesize=" + pag);
if (annotations)
{
request.Headers.Add("Prefer", OdataAnnotationAll);
}
return await CrmConnector.Client.SendAsync(request);
}
阅读回复:
using Newtonsoft.Json;
public virtual async Task<JObject> RequestCRM(HttpMethod method, string query, string pag, bool annotations)
{
JObject responseObject = new JObject();
HttpResponseMessage response = await RequestCRMAsync(method, query, pag, annotations);
if (response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.NoContent)
{
responseObject = JsonConvert.DeserializeObject<JObject>(response.Content.ReadAsStringAsync().Result);
}
else
{
throw new CrmHttpResponseException(response.Content);
}
return responseObject;
}
如果您正在创建或更新,则必须在正文中发送参数:
JObject data = new JObject();
data.Add("firstname", "Sxntk");
data.Add("lastname", "IG");
data.Add("annualincome", "1000000000");
request.Content = new StringContent(data.ToString(), Encoding.UTF8, "application/json");
如果是创建或更新,则 guid 将出现在此标头中:
protected virtual string GetGuidFromResponse(HttpResponseMessage response)
{
string RegexGuid = @"(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}";
// Get the url -> http://~/entity(guid)
var urlHeader = response.Headers.FirstOrDefault(x => x.Key == "OData-EntityId");
//Type of this is KeyPairValue
if (urlHeader.Value == null)
{
return null;
}
// Get the guid form url
return Regex.Matches(urlHeader.Value.FirstOrDefault(), RegexGuid)?[0].Value;
}
更新 http 方法是 PATCH 而不是 POST。
来自 Microsoft 帮助程序的类是 Authentication、Configuration、Exceptions 和 CrmConnector 已修改。