Доступ к данным CRM Dynamics 365 с помощью URL-адреса корневого каталога службы для веб-API

Моя проблема связана с доступом к данным Dynamics CRM 365 в службе RESTful.

Я хочу использовать данные Dynamics CRM в службе RESTful. Эта служба RESTful будет использоваться в службах WCF для подключения мобильного приложения к доступу к данным CRM.

Я просмотрел приведенную ниже ссылку, но не похоже, что какой-либо из них будет работать для меня. Здесь я хочу попытаться избежать использования Azure.

Для выполнения вышеуказанного требования я попытался использовать CODE, указанный в приведенной ниже ссылке: Ссылка 1: образец данных запроса веб-API Microsoft CRM (CS), но он также дает ошибку, как показано на прилагаемом снимке экрана

Error ScreenShot

Зона ошибки: в файле Program.cs - при попытке получить результат выдает ошибку в следующей строке кода:

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

Если ссылка, указанная выше как Ref 1, является правильным способом, то как я должен получить ClientId и RedirectUrl?


person Community    schedule 28.11.2017    source источник


Ответы (1)


Это код, использующий пример 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/; [email protected]; 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.

Классы от помощников Майкрософт: Аутентификация, Конфигурация, Исключения и измененный CrmConnector.

person Sxntk    schedule 30.11.2017