Простой клиент Odata - Как добавить токен oAuth в каждый заголовок запроса?
В прокси-клиенте Microsoft oData v4 есть возможность добавлять токен аутентификации в каждый запрос. Это может быть достигнуто следующим образом:
var container = new Default.Container(new Uri(http://localhost:9000/));
//Registering the handle to the BuildingRequest event.
container.BuildingRequest += (sender, e) => OnBuildingRequest(sender, e, accessToken);
//Every time a OData request is build it adds an Authorization Header with the acesstoken
private static void OnBuildingRequest(object sender, BuildingRequestEventArgs e, TokenResponse token)
{
e.Headers.Add("Authorization", "Bearer " + token.AccessToken);
}
Как я могу сделать то же самое, используя простой клиент odata?
1 ответ
Видимо, я должен дать объяснение, почему это ответ.
Объяснение: так вы добавляете токен для простого ODataClient.
var settings = new ODataClientSettings(new Uri("http://localhost:9000/"));
settings.BeforeRequest += delegate(HttpRequestMessage message)
{
message.Headers.Add("Authorization", "Bearer " + token.AccessToken);
};
var client = new ODataClient(settings);
Вместо использования метода делегата для перехвата и добавления заголовка авторизации при каждом вызове Http более ясным / чистым решением является создание экземпляра ODataClient с экземпляром HttpClient.
Это также позволяет вам управлять жизненным циклом HttpClient и повторно использовать его (как вы все равно должны делать в обычном режиме!), Иначе ODataClient будет создавать новый экземпляр HttpClient при каждом вызове, а это просто неэффективно и вызывает большой отток на уровне сокетов. Обычно это не проблема, но может быть при большом объеме кода, так что просто хорошая привычка.
Приведенный ниже код представляет собой отрывок из основного приложения. Net, использующего токен OAuth2 Azure AD для подключения к Dynamics 365 OData Web API.
httpClient.BaseAddress = new Uri(yourODataServiceRootURL);
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", yourBearerAccessToken);
//Use the httpClient we setup with the Bearer token header
var odataSettings = new ODataClientSettings(httpClient, new Uri("api/data/v9.1", UriKind.Relative));
var odataClient = new ODataClient(odataSettings);