c# - 使用 Web API 的服务根 URL 访问 CRM Dynamics 365 数据

标签 c# rest dynamics-crm microsoft-dynamics dynamics-crm-webapi

我的问题是在 RESTful 服务中访问 Dynamics CRM 365 数据。

我想在 RESTful 服务中使用 Dynamics CRM 数据。此 RESTful 服务将在 WCF 服务中使用,以将移动应用程序连接到 CRM 数据访问。

我已经阅读了以下引用资料,但看起来它们都不适合我。在这里,我想尽量避免使用 Azure。

针对上述要求,我尝试使用以下引用资料中提供的CODE: Ref 1: Microsoft CRM Web API Query Data Sample (CS) , 但这也给出了随附的错误 screenshot

Error ScreenShot

错误区域:在 Program.cs 文件中 - 当它尝试获取结果时会在下面的代码行中抛出错误:

HttpResponseMessage response = SendAsJsonAsync(httpClient, HttpMethod.Post,
            "accounts", account1).Result;

如果上面作为 Ref 1 共享的链接是正确的方法,那么我应该如何获取 ClientIdRedirectUrl

最佳答案

这是使用 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 helpers 的类是 Authentication、Configuration、Exceptions 和 CrmConnector modified。

关于c# - 使用 Web API 的服务根 URL 访问 CRM Dynamics 365 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47528027/

相关文章:

c# - 使用 Web 服务查询检索 Dynamics CRM 自定义字段

dynamics-crm-2011 - 如何按查找实体的字段对 View 中的项目进行排序?

c# - 将图像上传到 SQL 数据库

c# - 动态选项对话框(使用反射)

c# - 我可以回到不使用 ReSharper 的状态吗?

c# - System.Configuration.ConnectionStringSettingsCollection.this[string].get 返回 null

java - 以 json 格式返回 URL,而不是 ArrayList

python - 从第 3 方 REST API 构建的 Django 网站内容

java - Spring RepositoryRestResource 带有路径参数?

dynamics-crm - 在CRM 4中使用QueryExpression时是否可以限制响应中返回的结果数量