2017-12-26 28 views
0

받은 봇 빌더를 사용하여받은 메시지를 webhook 끝점으로 보내 봇을 만들고 싶습니다. 나는 주위를 검색하는 것으로부터 발견 된 몇 가지 예제를 결합하려했지만 아무 소용이 없다. 나는 텍스트의 가치와 JSON 페이로드로은 webhook에 사용자가 입력 한 텍스트를 보내 도움이 필요, 여기에 내가 지금 가지고있는 코드입니다 :Microsoft Bot Builder activity.text REST를 JSON 페이로드로 사용하여 POST로 webhook에 게시

using System; 
using System.Net; 
using System.IO; 
using System.Threading.Tasks; 
using Microsoft.Bot.Builder.Dialogs; 
using Microsoft.Bot.Connector; 
using System.Web.Script.Serialization; 

namespace Bot_Application1.Dialogs 
{ 

    [Serializable] 
    public class RootDialog : IDialog<object> 
    { 

     public Task StartAsync(IDialogContext context) 
     { 
      context.Wait(MessageReceivedAsync); 

      return Task.CompletedTask; 
     } 

     private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> 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"); 

      // 
      var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://outlook.office.com/webhook/.../IncomingWebhook/.../..."); 
      httpWebRequest.ContentType = "application/json"; 
      httpWebRequest.Accept = "application/json"; 
      httpWebRequest.Method = "POST"; 

      using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
      { 
       string json = new JavaScriptSerializer().Serialize(new 
       { 
        text = "\"" + activity.Text + "\"" 
        }); 
       streamWriter.Write(json); 
       streamWriter.Flush(); 
       streamWriter.Close(); 
      } 
      // 

      context.Wait(MessageReceivedAsync); 
     } 
    } 
} 

이이 https://docs.microsoft.com/en-us/bot-framework/dotnet/bot-builder-dotnet-quickstart

의 기반으로하는 경우 I 피들러로 모니터링하는 동안 테스트 봇과 클라이언트 간의 통신은 볼 수 있지만 절대로 REST http 요청은 볼 수 없습니다. 나는 이것이 어쨌든 최선의 방법이라고 확신하지 못하고 어떤 피드백을 좋아할 것입니다.

이 엔드 포인트에 성공적으로 POST는 다음과 같습니다

POST /webhook/.../IncomingWebhook/.../... HTTP/1.1 
Host: outlook.office.com 
User-Agent: insomnia/5.12.4 
Content-Type: application/json 
Accept: application/json 
Content-Length: 26 
{ 
    "text":"Hello world!" 
} 

나는 당신의 도움을 주셔서 감사합니다!

+0

요청을 작성 중이지만 마지막 요청을하지는 마십시오. 코드에'(HttpWebResponse) httpWebRequest.GetResponse();'가 없습니다. 아래 답변을보십시오. –

답변

1

실제로 요청을 끝내지 않는 것처럼 보입니다. 코드를 다음으로 변경하십시오.

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> 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"); 

     // 
     var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://outlook.office.com/webhook/.../IncomingWebhook/.../..."); 
     httpWebRequest.ContentType = "application/json"; 
     httpWebRequest.Accept = "application/json"; 
     httpWebRequest.Method = "POST"; 

     using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
     { 
      string json = new JavaScriptSerializer().Serialize(new 
      { 
       text = "\"" + activity.Text + "\"" 
      }); 
      streamWriter.Write(json); 
      streamWriter.Flush(); 
      streamWriter.Close(); 
     } 
     //Make the actual request 
     var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
     using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
     { 
      //Get the output 
      var result = streamReader.ReadToEnd(); 
     } 
     // 

     context.Wait(MessageReceivedAsync); 
    }