Я пытаюсь адаптировать код, упомянутый здесь, чтобы возвращать объект 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 поэтому просто пытаюсь адаптировать код, который я нахожу онлайн для своих нужд.