Я работаю над проактивным сообщением для BOT, размещенного в IIS и зарегистрированного в Azure как BOT канала регистрации BOT.
Я получаю ошибку ниже,
Сообщение: операция вернула недопустимый код состояния «Не авторизован».
StackTrace: в
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task
задача) в
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task
задача) в
Microsoft.Bot.Connector.ConversationsExtensions.d__17.MoveNext ()
Код приведен ниже,
- Notify.cs
public class Notify
{
private readonly IBotFrameworkHttpAdapter _adapter;
private readonly string _appId;
private readonly ConcurrentDictionary<string, ConversationReference> _conversationReferences;
public Notify(IBotFrameworkHttpAdapter adapter, string appId, ConcurrentDictionary<string, ConversationReference> conversationReferences)
{
_adapter = adapter;
_appId = appId;
_conversationReferences = conversationReferences;
}
public async Task<IActionResult> Get()
{
try
{
foreach (var conversationReference in _conversationReferences.Values)
{
await ((BotAdapter)_adapter).ContinueConversationAsync(_appId, conversationReference, BotCallback, default(CancellationToken));
}
// Let the caller know proactive messages have been sent
return new ContentResult()
{
Content = "<html><body><h1>Proactive messages have been sent.</h1></body></html>",
ContentType = "text/html",
StatusCode = (int)HttpStatusCode.OK,
};
}
catch (Exception ex)
{
throw ex;
}
}
private async Task BotCallback(ITurnContext turnContext, CancellationToken cancellationToken)
{
await turnContext.SendActivityAsync("proactive hello");
}
}
Редактировать 1:
Я пытаюсь отправить проактивное сообщение боту, отображаемому в
значок системного Мы создали приложение для Windows, с помощью которого мы
отправляем уведомления Windows пользователям. Когда пользователь нажимает на
уведомление открывает бот, присутствующий в значке в системном трее, и он должен
отобразить то же сообщение с уведомлением о сообщении в BOT, что и проактивное сообщение.
Мы используем API прямой линии для создания ссылки на разговор. Мы
проходят ту же ссылку на разговор и используют
ContinueConversationAsync BotApadater для заполнения того же сообщения
с открытого бота. Весь код form.cs и Notify.cs возвращается в приложении Windows, а бот размещается на IIS и регистрируется в Azure как
БОТ Канал регистрации БОТ.
В настоящее время мы не получаем несанкционированную ошибку и код
выполнено успешно, но мы не получаем активного сообщения
от бота.
Для открытия бота мы используем iframe URL в приложении Windows.
Пожалуйста, помогите мне понять, что я делаю не так, или предложите другие способы.
Окно systray приложения Form.cs Метод
using (HttpClient httpClient = new HttpClient())
{
httpClient.BaseAddress = new Uri("https://directline.botframework.com/api/tokens");
httpClient.DefaultRequestHeaders.Accept.Clear();
//httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("BotConnector", "Directline secret");
HttpResponseMessage response = httpClient.GetAsync(httpClient.BaseAddress).Result;
if (response.IsSuccessStatusCode)
{
var jsonString = response.Content.ReadAsStringAsync();
var token = jsonString.Result;
var finaltoken = token.Replace(@"\", string.Empty);
finaltoken = finaltoken.Replace('"', ' ').Trim();
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("https://directline.botframework.com/v3/directline/conversations");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(finaltoken);
var httptokenResponse = httpClient.PostAsync("/api/conversations/", new StringContent(string.Empty, System.Text.Encoding.UTF8, "application/json"));
var tokenResponse = httptokenResponse.Result;
string convId = string.Empty;
string activityId = string.Empty;
HttpClient finalclient = new HttpClient();
Microsoft.Bot.Schema.Activity act = new Microsoft.Bot.Schema.Activity();
ConversationReference convRef = new ConversationReference();
if (tokenResponse.IsSuccessStatusCode)
{
var tokenjsonString = tokenResponse.Content.ReadAsStringAsync().Result;
var conversationToken = Newtonsoft.Json.JsonConvert.DeserializeObject<Conversation>(tokenjsonString.ToString());
HttpClient lastclient = new HttpClient();
lastclient.BaseAddress = new Uri("https://directline.botframework.com/v3/directline/conversations/" + conversationToken.conversationId + "/activities");
lastclient.DefaultRequestHeaders.Accept.Clear();
lastclient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
lastclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "Directline secret");
string conversationUrl = conversationToken.conversationId + "/activities/";
string msg2 = "User Message";
Rootobject rootobject = new Rootobject();
rootobject.type = "message";
rootobject.text = msg2;
From from = new From();
from.id = "User ID";
from.user = "User Name";
rootobject.from = from;
string json = "";
json = Newtonsoft.Json.JsonConvert.SerializeObject(rootobject);
var httpconvResponse = lastclient.PostAsync(lastclient.BaseAddress, new StringContent(json, System.Text.Encoding.UTF8, "application/json"));
var tokenconvResponse = httpconvResponse.Result;
if (tokenconvResponse.IsSuccessStatusCode)
{
var tokenconvjsonString = tokenconvResponse.Content.ReadAsStringAsync().Result;
var conversationconvToken = Newtonsoft.Json.JsonConvert.DeserializeObject<ConversationActivityInfo>(tokenconvjsonString.ToString());
convId = conversationToken.conversationId;
activityId = conversationconvToken.id.Split('|')[1];
finalclient.BaseAddress = new Uri("https://directline.botframework.com/v3/directline/conversations/" + conversationToken.conversationId + "/activities");
finalclient.DefaultRequestHeaders.Accept.Clear();
finalclient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
finalclient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "Directline Secret");
var httpconvfinalResponse = finalclient.GetAsync(finalclient.BaseAddress).Result;
var jsonResponseString = httpconvfinalResponse.Content.ReadAsStringAsync();
var finalresponse = jsonResponseString.Result;
var activitiesObject = Newtonsoft.Json.JsonConvert.DeserializeObject<ActivitiesRO>(finalresponse);
act = activitiesObject.activities[1];
convRef = act.GetConversationReference();
}
}
string MicroSoftAppId = "YOUR Microsoft APP ID";
string MicroSoftAppPassword = "YOUR Microsoft APP PASSWORD";
ICredentialProvider credentialProvider = new SimpleCredentialProvider(MicroSoftAppId, MicroSoftAppPassword);
MicrosoftAppCredentials.TrustServiceUrl(convRef.ServiceUrl);
IBotFrameworkHttpAdapter adapter = new BotFrameworkHttpAdapter(credentialProvider);
ConcurrentDictionary<string, ConversationReference> conversationReferences = new ConcurrentDictionary<string, ConversationReference>();
convRef.Bot = new ChannelAccount("Bot ID", "Bot Name");
conversationReferences.GetOrAdd("test", convRef);
Notify notify = new Notify(adapter, MicroSoftAppId, conversationReferences);
Task<IActionResult> obj = notify.Get();
}
}
** Редактировать 2: **
Пожалуйста, смотрите ниже скриншот, мы получаем три идентификатора активности после отправки запроса на ниже URL,
https://directline.botframework.com/v3/directline/conversations/" + разговорToken.conversationId + "/ деятельность"
Из которых мы используем действие Index 1 , так как оно содержит URL-адрес службы и сведения о пользователе, которым нужно отправить упреждающее сообщение, и не имеет сведений о BOT (свойство Bot), поэтому мы назначаем его вручную.
![enter image description here](https://i.stack.imgur.com/vkgE3.jpg)