Сбой загрузки мультимедиа в Google Cloud Search для сторонних разработчиков - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь загрузить файл для индексации с помощью Google.Apis.CloudSearch.v1 in. Net

Я следую инструкциям, предоставленным Google здесь https://developers.google.com/cloud-search/docs/reference/rest/v1/media/upload

Однако я получаю сообщение об ошибке при выполнении Upload ()

{"Google.Apis.Requests.RequestError\r\nCould not decode resource name. [400]\r\nErrors [\r\n\tMessage[Could not decode resource name.] Location[ - ] Reason[badRequest] Domain[global]\r\n]\r\n"}

для этого примера, я использую схему mov ie. Предположим, что размер файла PDF превышает 100 КиБ.

Код ниже

string resourceName = string.Format("datasources/{0}/items/{1}", config.DS_Id, MovieName);

byte[] byteArray = File.ReadAllBytes("C:\\TEMP\\TEST.pdf");
Stream stream = new MemoryStream(byteArray);

Media m = new Media();
m.ResourceName = resourceName;

UploadItemRef UR = CSService.Indexing.Datasources.Items.Upload(new StartUploadItemRequest() { }, resourceName).Execute();
MediaResource.UploadMediaUpload uploadMediaUpload = new MediaResource.UploadMediaUpload(CSService, m, resourceName, stream, "RAW");
uploadMediaUpload.UploadProtocol = "raw";
uploadMediaUpload.UploadType = "media";
Google.Apis.Upload.IUploadProgress TestUpload = uploadMediaUpload.Upload();

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Найден ответ

Проблема с библиотекой. net. Я нашел художественное решение именно этой проблемы на github (ссылка ниже). Вся заслуга должна go автору, который первым разместил этот код на github. Поскольку проблема заключалась в том, что функция Upload не работала в библиотеке. net, было решено запустить сборку метода вручную. Кроме того, убедитесь, что вы используете служебную учетную запись для создания UploadItemRef. Если вы просто используете обычную учетную запись, это не приведет к ошибке и загрузка также не будет работать. Это копия кода с github.

private void UploadFile(string contentRef, string resourceName, string documentContent)
{
    var uri = $"https://cloudsearch.googleapis.com/upload/v1/media/{contentRef}?uploadType=multipart";

    var token = ((ServiceAccountCredential) _googleClient.HttpClientInitializer).Token.AccessToken;

    using var httpClient = new HttpClient();
    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

    using var content = new MultipartFormDataContent("--BOUNDARY");

    var bodyContent = new StringContent("{ \"resourceName\": \"" + resourceName + "\" }", Encoding.UTF8, "application/json");
    content.Add(bodyContent);

    using var stream = new MemoryStream(Encoding.UTF8.GetBytes(documentContent));

    using var streamContent = new StreamContent(stream);
    streamContent.Headers.ContentType = new MediaTypeHeaderValue("text/plain");

    content.Add(streamContent);

    // .net adds this header automatically but Google doesn't like it
    foreach (var item in content) item.Headers.Remove("Content-Disposition");

    using var task = httpClient.PostAsync(uri, content);
    task.Wait(); // don't run async for testing
}

подробнее здесь

https://github.com/googleapis/google-api-dotnet-client/issues/1481

0 голосов
/ 15 апреля 2020

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

Определите вариант использования, который поможет решить Облачный поиск Google.

Определите репозитории, содержащие данные, относящиеся к варианту использования.

Укажите системы идентификации, используемые вашей компанией для управления доступом к данным в каждом хранилище.

Настройка доступа к REST API Google Cloud Search.

Добавление источника данных в Google Cloud Search .

Введение в Google Cloud Search

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...