---
title: "Создание вспомогательных классов ODataProxy для подключения к D365O по протоколу OData"
canonical: https://ontargit.com/kz/sozdanie-odataproxy-dlya-d3650-po-protokolu-odata/
date: 2021-04-21 17:42:48
description: "Создание вспомогательных классов ODataProxy для подключения по протоколу OData для уменьшения количества кода, требуемого для подключения"
keywords: "ODataProxy"
categories: [ERP]
---

# Описание

Для уменьшения количества кода, требуемого для подключения к OData вебсервисам, необходимо использовать автоматически генерируемый прокси класс. Этот класс содержит множество вложенных классов, которые соответствуют data entity, находящимся по указанному адресу, который может быть адресом D365O. Используя их, можно считывать, создавать, обновлять и удалять данные.

Чтобы еще больше упростить подключение к OData вебсервисам D365O, мною был написан базовый класс OData клиента ODataServiceBase, который убирает необходимость самостоятельно инициализировать подключение к прокси классу и добавлять авторизационные хедеры OAuth, необходимые в вебсервисах D365O.

Рекомендуется создать проект, который будет содержать сгенерированный прокси класс и класс ODataServiceBase, и использовать ссылку на него в собственных проектах.

# Подготовительный этап

- __

1. Подключить ссылку на проект, содержащий классы AuthenticationUtility из статьи ****[**«Создание классов AuthenticationUtility»**.](https://ontargit.com/sozdanie-klassov-authentication-utility/)

- __

2. Добавить пакет Microsoft.OData.Client как описано в статье **[«Добавление пакета Microsoft.OData.Client».](https://ontargit.com/dobavlenie-paketa-microsoft-odata-client/)**

# Принцип работы

Класс ODataServiceBase содержит только конструктор, инициализирующий необходимые для подключения к D365O элементы.

Сначала в нем создается объект клиента прокси класса:

Copy to Clipboard
Syntax HighlighterResources oDataClient = new Resources(oDataUri);

В качестве URL используется базовый адрес D365O из AuthenticationUtility Microsoft с приставкой **data**.

Далее к объекту клиента крепится хедер авторизации из AuthenticationUtility Microsoft:

Copy to Clipboard
Syntax HighlighteroDataClient.SendingRequest2 += new EventHandler(**
 delegate (

 object delegateSender,

 SendingRequest2EventArgs delegateE)

 {

 var authenticationHeader = OAuthHelper.GetAuthenticationHeader();

 delegateE.RequestMessage.SetHeader(

 OAuthHelper.OAuthHeader,

 authenticationHeader);

 });

Сам по себе класс ODataServiceBase больше ничего не делает, – он используется как базовый класс для классов-наследников, которые и содержат логику подключений к data entity клиента, объявленого в ODataServiceBase.

# Генерация прокси класса

Для генерации прокси класса сначала нужно добавить расширение для Visual Studio, открыв Tools / Extensions and Updates.**

[_](https://ontargit.com/wp-content/uploads/2021/04/Picture1-11.png)

В открывшемся окне выбрать слева вкладку Online / Visual Studio Gallery.

[](https://ontargit.com/wp-content/uploads/2021/04/Picture2-7.png)

После этого в поиске в правом верхнем углу ввести OData v4 Client Code Generator и нажать Download возле найденного результата.

[](https://ontargit.com/wp-content/uploads/2021/04/Picture3-6.png)

При этом откроется окно, в котором нужно нажать кнопку Install. После установки окно Extensions and Updates можно закрыть.

Далее нужно создать проект C# и добавить в него новый элемент типа OData Client.

[](https://ontargit.com/wp-content/uploads/2021/04/Picture4-3.png)

При этом создастся файл с расширением .tt. Файл будет выглядеть как показано в примере далее, но без выделенных жирным шрифтом строк:

Copy to Clipboard
Syntax Highlighter

Выделенные жирным шрифтом MetadataDocumentUri и TempFilePath нужно указать самостоятельно.

MetadataDocumentUri – основной параметр файла, который содержит адрес ресурса с data entity. Для D365O он равен базовому адресу с приставкой /data. В примере это https://oit-adm-boryseda2b5401719f08ddevaos.cloudax.dynamics.com/data.

TempFilePath – это параметр, указывающий адрес на компьютере, куда нужно сохранить XML разметку data entity. По умолчанию параметр пуст, и это значит, что разметка будет храниться вместе с кодом C#. Возможно для некоторых ресурсов с развернутыми вебсервисами OData это приемлемо, из-за небольшого количества data entity, но в случае с D365O, количество data entity слишком велико для хранения XML разметки вместе с кодом, – они просто не помещаются в прокси класс. Поэтому для D365O этот параметр обязателен.

После сохранения изменений в файле автоматически выполняется скрипт генерации прокси класса и XML разметки (в одном или в двух разных файлах). Полученный прокси класс можно использовать у себя в программах.

Полученный результат содержит в себе, в частности, статус выполнения (успешно/неуспешно), а также выходные данные веб-сервиса, или сообщение с текстом ошибки, если что-то пошло не так. Для обработки результата проверяется статус выполнения запроса, после чего считывается его содержимое. Как в случае с получением выходных данных, так и в случае с получением текста ошибки, эта информация получается в виде строки JSON.

# Программный код

Copy to Clipboard
Syntax Highlighterusing AuthenticationUtility;

using Microsoft.OData.Client;

using ODataProxy.Microsoft.Dynamics.DataEntities;

using System;

namespace ODataProxy

{

 public class ODataServiceBase

 {

 protected Resources client = null;

 public ODataServiceBase()

 {

 client = this.buildODataClient();

 }

 private Resources buildODataClient()

 {

 Uri oDataUri = new Uri(

 string.Format(

 “{0}data”,

 ClientConfiguration.Default.UriString),

 UriKind.Absolute);

 Resources oDataClient = new Resources(oDataUri);

 oDataClient.SendingRequest2 += new EventHandler(

 delegate (

 object delegateSender,

 SendingRequest2EventArgs delegateE)

 {

 var authenticationHeader = OAuthHelper.GetAuthenticationHeader();

 delegateE.RequestMessage.SetHeader(

 OAuthHelper.OAuthHeader,

 authenticationHeader);

 });

 return oDataClient;

 }

 }

}

_

# Подготовил статью:

ДыкухаБорис Александрович

Senior Software Developer, OntargIT

[](https://www.linkedin.com/in/borys-dykukha-59a7a2a9)