title: Valid KnowledgeBaseId and SubscriptionKey not provided
body: <p>I need help, after migrating to the new QNAMaker, im now getting an error: Valid KnowledgeBaseId and SubscriptionKey not provided. Use QnAMakerServiceAttribute or set fields on QnAMakerDialog. What am i missing? Subscription Key and KnowledgebaseID was already added. I simply followed the sample http request upong publishing in the qnamaker portal.</p>
  
  <p><a href="https://i.stack.imgur.com/r5f0h.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/r5f0h.png" alt="enter image description here"></a></p>
  
  <pre><code>using Microsoft.Bot.Builder.Dialogs;
  using QnAMakerDialog;
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Web;
  using System.Threading;
  using Microsoft.Bot.Connector;
  using System.Threading.Tasks;
  using Microsoft.Bot.Builder.CognitiveServices.QnAMaker;
  
  namespace TEST.Dialog
  {
  [Serializable]
  
  [QnAMaker(authKey:"013ffd97-XXXX-XXXX-981f-ea298085591c", knowledgebaseId:"f81ce668-XXXX-XXXX-XXXX-ad20c5f4d3fa", endpointHostName:"https://XXXX.azurewebsites.net/qnamaker")]
  public class QnADialog : QnAMakerDialog&lt;object&gt;
  {
     public async Task StartAsync(IDialogContext context)
      {
          context.PrivateConversationData.TryGetValue("Name", out name);
          await context.PostAsync($"Hello {name}. The QnA Dialog was started. Ask a question.");
          context.Wait(MessageReceivedAsync);
  
      }
  
      public async Task DefaultMatchHandler(IDialogContext context, string originalQueryText, QnAMakerResult result)
      {
          try
          {
              // ProcessResultAndCreateMessageActivity will remove any attachment markup from the results answer
              // and add any attachments to a new message activity with the message activity text set by default
              // to the answer property from the result
             // var messageActivity = ProcessResultAndCreateMessageActivity(context, ref result);
              if (result.Score &gt; 30 &amp;&amp; result.Answer != NOMATCH)
              {
                  await context.PostAsync(result.Answer);
                  context.Wait(this.MessageReceived);
                  return;
              }
              else
              {
                  await context.Forward(new RootLuisDialog(), DialogsCompleted, context.Activity, CancellationToken.None);
              }
          }
          catch (Exception ex)
          {
              throw;
          }
  
      }
  
      public override async Task NoMatchHandler(IDialogContext context, string originalQueryText)
      {
          try
          {
              await context.Forward(new RootLuisDialog(), DialogsCompleted, context.Activity, CancellationToken.None);
          }
          catch (Exception ex)
          {
              throw;
          }
  
      }
  
      private async Task MessageReceivedAsync(IDialogContext context, IAwaitable&lt;object&gt; result)
      {
          var activity = await result as Activity;
  
          // calculate something for us to return
          int length = (activity.Text ?? string.Empty).Length;
  
          // return our reply to the user
          //await context.PostAsync($"You sent {activity.Text} which was {length} characters");
  
          context.Wait(this.MessageReceived);
          return;
      }
  
       private async Task DialogsCompleted(IDialogContext context, IAwaitable&lt;object&gt; result)
      {
          var success = await result;
          //if (!(bool)success)
          //    await context.PostAsync("I'm sorry. I didn't understand you.");
  
          //context.UserData.Clear();
          context.Wait(MessageReceived);
      }
  
  
      [QnAMakerResponseHandler(30)]
      public async Task LowScoreHandler(IDialogContext context, string originalQueryText, QnAMakerResult result)
      {
          //await context.PostAsync($"I found an answer that might help: {result.Answer}");
          await context.Forward(new RootLuisDialog(), DialogsCompleted, context.Activity, CancellationToken.None);
          //context.Wait(MessageReceived);
      }
  }
  }
  </code></pre>
  
  <p><strong>RootDialog that calls QNAMaker:</strong></p>
  
  <pre><code>using Microsoft.Bot.Builder.Dialogs;
  using Microsoft.Bot.Builder.FormFlow;
  using System;
  using System.Collections.Generic;
  using System.IO;
  using System.Linq;
  using System.Net;
  using System.Net.Http;
  using System.Threading;
  using System.Threading.Tasks;
  using System.Web;
  
  namespace Test.Dialog
  {
  [Serializable]
  public class RootDialog : IDialog&lt;object&gt;
  {
      public string name = string.Empty;
      public Task StartAsync(IDialogContext context)
      {
          context.Wait(MessageReceivedAsync);
          return Task.CompletedTask;
      }
  
  
       private async Task MessageReceivedAsync(IDialogContext context, IAwaitable&lt;object&gt; result)
      {
          try
         {
              //Some User Code that retreives user via PrivateConversationData
  
  
  
  
              //Calls QNADialog
  
              context.Call(new QnADialog(), MessageReceivedAsync);
         }
  }
  </code></pre>
  
  <p>}</p>
  
  <p>My Version of CognitiveServices: 
  Microsoft.Bot.Builder.CognitiveServices.1.1.7 
  Bot Builder,Bot Connector :3.15.2.2
  QNADialog: 1.2.0</p>