2017-03-12 8 views
10

BotFramework 3.5で構築されたボットをWebAppとしてAzureでホストしています。私はボットがユーザーの入力に応答する必要があるシナリオの実装には何の問題も抱えていませんでした。しかし、いくつかのスケジュールで会話を始めるように彼に教える必要があります。 目標を達成するためには、基本的に単純なコンソールアプリであるWebJobを作成しました。ここではボットからユーザーへのメッセージを開始するのに使用されるコードです:BotFrameworkのボットからユーザへのメッセージの開始

  var botAccount = new ChannelAccount(id: from); 
      var userAccount = new ChannelAccount(id: to); 
      var conversation = new ConversationAccount(false, conversationId); 

      var connector = new ConnectorClient(serviceUrl); 

      IMessageActivity message = Activity.CreateMessageActivity(); 
      message.From = botAccount; 
      message.Recipient = userAccount; 
      message.Conversation = conversation; 
      message.Text = text; 
      message.Locale = locale; 
      await connector.Conversations.SendToConversationAsync((Activity)message); 

from, to, serviceUrl, conversationId - 前回の会話から取られているが、私は、彼らが有効である期待します。しかしSendToConversationAsync例外にスローされます。

System.UnauthorizedAccessException: Authorization for Microsoft App ID 3a26a4d4-f75a-4feb-b3e0-37a7fa24e5fc failed with status code Unauthorized and reason phrase 'Unauthorized' ---> System.Net.Http.HttpRequestException: Response status code does not indicate success: 401 (Unauthorized) 

app.configファイルには、APPIDとAppSecretを含む元ボットAPI、同じ値が含まれています。私は同じ話題についていくつかの質問をしましたが、回答を見つけることはできませんでした。

何か不足していますか?ボットに代わってメッセージをコンソールアプリケーションから送信する有効なアプローチですか?このように新しい会話を作成

+0

は、あなたのWebアプリケーションの使用を認証、許可していますか? – Thomas

+0

は、web.configで定義された3つの認証パラメータ(AppId、AppPassword、BotId)を使用します。コンソールアプリケーションに同じ値が注入される – Artem

+0

認証が設定されているWebアプリケーションのコードを投稿できますか?あなたはどのようにWebアプリケーションを認証しますか?あなたはトークンを送っていますか? – Thomas

答えて

16

あなたの説明によると、私はコネクタを使い始めるために、このtutorialを踏襲し、活動を送受信するため、このtutorialを追いました。

あなたのコードに基づいて、私は私のコンソールアプリケーションを作成しました。同じ問題を再現できました。そして同様の問題についてg30 issueが見つかりました。いくつかの試行の後、私はあなたがそれを参照してください可能性があり、私の側に期待通りに動作させることができます:

MicrosoftAppCredentials.TrustServiceUrl("{ServiceUrl}", DateTime.Now.AddDays(7)); 
var account=new MicrosoftAppCredentials("MicrosoftAppIdKey", "MicrosoftAppPasswordKey"); 
var connector = new ConnectorClient(new Uri("{ServiceUrl}"),account); 

OR

は、その後、あなたのDelegatingHandler

public class MyDelegatingHandler : DelegatingHandler 
{ 
    private string _token; 
    public MyDelegatingHandler(string token) 
    { 
     _token = token; 
    } 

    protected override Task<HttpResponseMessage> SendAsync(
    HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", _token); 
     return base.SendAsync(request, cancellationToken); 
    } 
} 

を実装します ConnectorClientを次のように作成する必要があります。

ここで
var account=new MicrosoftAppCredentials("{MicrosoftAppIdKey}", "{MicrosoftAppPasswordKey}"); 
var jwtToken=await account.GetTokenAsync(); 
var connector = new ConnectorClient(new Uri("{serviceUrl}"),handlers:new MyDelegatingHandler(jwtToken)); 

は私のコンソールアプリケーションのコードスニペットで、あなたはそれを参照することができます:

try 
{ 
    var userAccount = new ChannelAccount() { Id = "default-user", Name = "user" }; 
    var botAccount = new ChannelAccount() { Id = "934493jn5f6f348f", Name = "console-Bot" }; 
    string url = "{serviceUrl}"; 

    MicrosoftAppCredentials.TrustServiceUrl(url, DateTime.Now.AddDays(7)); 
    var account = new MicrosoftAppCredentials("{MicrosoftAppIdKey}", "{MicrosoftAppPasswordKey}"); 
    var connector = new ConnectorClient(new Uri(url), account); 

    IMessageActivity message = Activity.CreateMessageActivity(); 
    message.From = botAccount; 
    message.Recipient = userAccount; 
    message.Conversation = new ConversationAccount() { Id = "{conversationId}" }; 
    message.Text = "Message sent from console application!!!"; 
    message.Locale = "en-us"; 
    var response = await connector.Conversations.SendToConversationAsync((Activity)message); 
    Console.WriteLine($"response:{response.Id}"); 
} 
catch (Exception e) 
{ 
    Console.WriteLine($"exception:{e.Message}\r\n{e.StackTrace}"); 
} 

結果

enter image description here

+0

あなたの投稿は私がプロアクティブなメッセージを送信する際の認証の問題を克服するのに役立ちました。しかし、上記の2つのJWTアクセストークンコードをコメントアウトして、テストサーバーアプリケーションを再起動し、プロアクティブなメッセージを送信している間は正常に認証することができました。 – camelCase

+2

これ以上の効果は期待できません! – chris31389

+0

おい、あなたは素晴らしいです! –

0

試してみてください。

var conversationId = await connector.Conversations.CreateDirectConversationAsync(botAccount, userAccount); 
+0

しました。それは動作しません。どうやらエラーは会話の作成方法とは関連していません – Artem

関連する問題