Во-первых, я использую версию SDK 4.x.
Я хочу создать функцию поиска из onedrive с графическим API.
В случае с функцией поиска Teams (приложение), когда я использую функцию поиска, приложения возвращают информацию с содержимым файла и показывают ключевое слово поиска стресса.
Я хочу показать содержимое этого файла (не полный текст, только включая ключевое слово поиска)
Но ответ поиска не включает контент.
Итак, как я могу заменить эту функцию? Или я неправильно использую этот API?
Это код моего поискового запроса.
var searchResults = await graphServiceClient
.Drives[driveId2]
.Root
.Search(searchQuery)
.Request()
.GetAsync();
В случае графического обозревателя (Http-запрос)
https://graph.microsoft.com/v1.0/me/drives/{drive-id}/root/search(q='')
А также случай запроса контента для ответа, включая ReadTimeout и WriteTimeout.
var searchResults = await graphServiceClient
.Drives[driveId]
.Items[fileId]
.Content
.Request()
.GetAsync();





Во-первых, у нас есть API поиска прямо сейчас, чтобы удовлетворить ваши требования. Вы можете просмотреть ссылку, чтобы увидеть содержимое запроса и ответ. Тогда текущий документ показывает нам только образец с SDK v5. Не забудьте добавить необходимое разрешение File.Read.All Sites.Read.All или Files.ReadWrite.All Sites.ReadWrite.All, если необходимо. Вот коды.
using Microsoft.Graph.Search.Query;
using Microsoft.Graph.Models;
var requestBody = new QueryPostRequestBody
{
Requests = new List<SearchRequest>
{
new SearchRequest
{
EntityTypes = new List<EntityType?>
{
EntityType.ExternalItem,
},
ContentSources = new List<string>
{
"/external/connections/connectionfriendlyname",
},
Region = "US",
Query = new SearchQuery
{
QueryString = "contoso product",
},
From = 0,
Size = 25,
Fields = new List<string>
{
"title",
"description",
},
},
},
};
var result = await graphClient.Search.Query.PostAsQueryPostResponseAsync(requestBody);
Но поскольку вы пытаетесь использовать SDK V4, хотя я не нашел официального образца или других образцов для SDK V4, я думаю, что мы могли бы найти обходной путь, который отправляет HTTP-запрос напрямую вместо использования SDK. Поскольку вы уже использовали GraphClient в своем коде, я надеюсь, что у вас также есть коды, аналогичные приведенным ниже, которые содержат EnableTokenAcquisitionToCallDownstreamApi.
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddInMemoryTokenCaches();
Затем мы можем внедрить ITokenAcquisition в контроллер, чтобы сгенерировать токен доступа и использовать его для вызова API запроса.
public class HomeController : Controller
{
private readonly ITokenAcquisition _tokenAcquisition;
public HomeController(ITokenAcquisition tokenAcquisition)
{
_tokenAcquisition = tokenAcquisition;
}
public async Task IndexAsync(){
var accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(new string[] { "File.Read.All", "Sites.Read.All" });
var request = "{{\"requests\": [{{\"entityTypes\": [\"driveItem\", \"listItem\", \"list\"],\"query\": {{\"queryString\": \"contoso\"}]}}";
var content = new StringContent(request, Encoding.UTF8, "application/json");
var httpReqMesg = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/search/query")
{
Headers =
{
{ HeaderNames.Authorization, "Bearer "+ accessToken}
},
Content = content
};
var httpClient = _httpClientFactory.CreateClient();
var response = await httpClient.SendAsync(httpReqMesg);
var res = "";
if (response.StatusCode == HttpStatusCode.OK)
{
res = await response.Content.ReadAsStringAsync();
}
}
}
Кстати, если вы используете поток учетных данных клиента, у которого нет ITokenAcquisition. Мы можем использовать код ниже для создания токена доступа.
var scopes = new[] { "https://graph.microsoft.com/.default" };
var tenantId = "tenantId";
var clientId = "clientId";
var clientSecret = "clientSecret";
var clientSecretCredential = new ClientSecretCredential(
tenantId, clientId, clientSecret);
var token = clientSecretCredential.GetTokenAsync(tokenRequestContext).Result.Token;