AsyncCallback с типом возврата PSObject - S.DS.P (ldap directoryservices.protocols) - PullRequest
0 голосов
/ 27 января 2020

Я пытаюсь адаптировать код, упомянутый здесь, чтобы возвращать объект PowerShell как часть результата asynccallback. Я могу получить подробные и предупреждающие потоки, но не поток записи. Мне нужен способ отображения результатов асинхронного обратного вызова на консоли PowerShell.

LDAP

Оригинальный код на веб-сайте:

IAsyncResult asyncResult = 
connection.BeginSendRequest(
                            searchRequest,
                            PartialResultProcessing.
                                ReturnPartialResultsAndNotifyCallback,
                            RunAsyncSearch,
                            null);


// execute the search when the server has data to return)
static void RunAsyncSearch(IAsyncResult asyncResult)
{

Console.WriteLine("Asynchronous search operation called.");

if (!asyncResult.IsCompleted)
{
    Console.WriteLine("Getting a partial result");
    PartialResultsCollection result = null;

    try
    {
        result = connection.GetPartialResults(asyncResult);
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
    if (result != null)
    {
        for (int i = 0; i < result.Count; i++)
        {
            if (result[i] is SearchResultEntry)
            {
                Console.WriteLine("A changed just occured to: {0}",
                  ((SearchResultEntry)result[i]).DistinguishedName);
            }
        }
    }
    else
        Console.WriteLine("Search result is null");
}
else
{
    Console.WriteLine("The search operation has been completed.");
    try
    {
        // end the send request search operation
        SearchResponse response =
            (SearchResponse)connection.EndSendRequest(asyncResult);

        foreach (SearchResultEntry entry in response.Entries)
        {
            Console.WriteLine("{0}:{1}",
                response.Entries.IndexOf(entry),
                entry.DistinguishedName);
        }
    }
    // in case of some directory operation exception
    // return whatever data has been processed
    catch (DirectoryOperationException e)
    {
        Console.WriteLine(e.Message);
        SearchResponse response = (SearchResponse)e.Response;

        foreach (SearchResultEntry entry in response.Entries)
        {
            Console.WriteLine("{0}:{1}",
                response.Entries.IndexOf(entry),
                entry.DistinguishedName);
        }
    }
    catch (LdapException e)
    {
        Console.WriteLine(e.Message);
    }
}
}

Мой код (pscmdlet) для возврата psobject

 PSObject RunAsyncSearch(IAsyncResult asyncResult)
            {

                WriteVerbose("Asynchronous search operation called.");
                PartialResultsCollection result = null;

                if (!asyncResult.IsCompleted)
                {
                    WriteVerbose("Getting a partial result");
                    //PartialResultsCollection result = null;

                    try
                    {
                        result = Connection.Connection.GetPartialResults(asyncResult);
                    }
                    catch (Exception e)
                    {
                        WriteWarning(e.Message);
                    }
                    if (result != null)
                    {

                        for (int i = 0; i < result.Count; i++)
                        {
                            if (result[i] is SearchResultEntry)
                            {
                                var res = new PSObject();
                                res.Properties.Add(new PSNoteProperty("dn", string.Join(",", ((SearchResultEntry)result[i]).DistinguishedName)));
                                WriteObject(res);
                            }
                        }


                    }
                    else
                        WriteVerbose("Search result is null");
                }
                else
                {
                    WriteVerbose("The search operation has been completed.");
                    try
                    {
                        // end the send request search operation
                        SearchResponse response =
                            (SearchResponse)Connection.Connection.EndSendRequest(asyncResult);
                        var res = new PSObject();
                        foreach (SearchResultEntry entry in response.Entries)
                        {
                            res.Properties.Add(new PSNoteProperty("dn", string.Join(",", entry.DistinguishedName)));
                        }
                        WriteObject(res);
                    }
                    // in case of some directory operation exception
                    // return whatever data has been processed
                    catch (DirectoryOperationException e)
                    {
                        WriteWarning(e.Message);
                        SearchResponse response = (SearchResponse)e.Response;
                        var res = new PSObject();
                        foreach (SearchResultEntry entry in response.Entries)
                        {
                            //WriteObject($"A changed just occured to: {((SearchResultEntry)result[i]).DistinguishedName}");
                            res.Properties.Add(new PSNoteProperty("dn", "error"));
                        }
                        WriteObject(res);
                    }
                    catch (LdapException e)
                    {
                        WriteWarning(e.Message);
                    }
                }
            }

В настоящее время я получаю 2 ошибки:

PSObject RunAsyncSearch имеет неправильный тип возврата.

и

Не все пути кода возвращают значение.

Если я изменю psobject на void и заменим writeobject вызовами Console.Writeline, тогда я получу вывод. Так что это вопрос правильного синтаксиса. Также мне интересно, есть ли лучший способ написать этот метод asyn c с использованием async \ await?

Любая помощь приветствуется.

PS: Я C# новичок ie поэтому просто пытаюсь адаптировать код, который я нахожу онлайн для своих нужд.

...