我在使用MicrosoftGraph Webhook时遇到了一些麻烦。我认为我没有正确返回HTTP响应,因为当我将一个binding.pry放入我的控制器时,在发出请求后它会命中控制器。
但是,在命中我的控制器之前,请求似乎超时(请参阅下面的堆栈跟踪)。这是我的控制器代码和订阅请求代码,以及堆栈跟踪。我非常感谢你的帮助。
def self.create_subscription(user)
callback = Proc.new do |r|
r.headers['Authorization'] = "Bearer #{user.outlook_token.access_token}"
r.headers['Content-Type'] = 'application/json'
r.headers['X-AnchorMailbox'] = user.email
end
path = 'subscriptions'
data = {
changeType: "created, updated",
notificationUrl: "https://my_url/api/watch/outlookNotification",
resource: "me/mailFolders('Inbox')/messages",
expirationDateTime:"2017-08-19T06:23:45.9356913Z",
clientState: "subscription-identifier"
}
graph = MicrosoftGraph.new(base_url: 'https://graph.microsoft.com/v1.0',
cached_metadata_file: File.join(MicrosoftGraph::CACHED_METADATA_DIRECTORY, 'metadata_v1.0.xml'),
&callback)
response = graph.service.post(path, data.to_json)
end
def outlook_webhook
@token = params[:validationToken]
head 200, content_type: "text/plain", content_length: 7
response.body = @token
end
在14613ms完成500内部服务器错误(ActiveRecord:478.4ms)
OData :: ClientError(400 InvalidRequest:"订阅验证 请求超时。"从 " https://graph.microsoft.com/v1.0/subscriptions&#34):
app / models / outlook_wrapper.rb:44:create_subscription'
索引'
app/controllers/business/messages_controller.rb:18:in渲染 /Users/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_source.erb (7.9ms)呈现 /Users/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_trace.text.erb(1.9ms)呈现 /Users/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_request_and_response.text.erb (3.8ms)呈现 /Users/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/diagnostics.text.erb (176.2ms)
开始发帖 " / API /手表/ outlookNotification validationToken = YTJhMTk5MDQtYjdmOC00ZjYxLWIzOGEtMDczM2FjMTAxZTBj&#34?; for 52.161.110.176 at 2017-08-23 12:29:05 -0400处理方式 InboundEmailsController#outlook_webhook as HTML参数: {" validationToken" = GT;" YTJhMTk5MDQtYjdmOC00ZjYxLWIzOGEtMDczM2FjMTAxZTBj"} 在35ms内完成200 OK(ActiveRecord:0.0ms)
答案 0 :(得分:0)
Content-Length为7不足以容纳验证令牌。
就请求超时而言,在本地测试时,notificationUrl
是可公开访问的网址吗?如果您使用http://localhost/api/watch/outlookNotification
之类的内容,那么Microsoft将不知道如何访问您的webhook,因为localhost
不是可公开访问的主机。
即使你确实提供了一个可公开访问的主机,你仍然需要在防火墙上挖洞。我的建议是在本地测试时使用ngrok并使用环境变量来设置主机。
在控制台中运行ngrok http 3000
,它会为您提供类似https://d83375e5.ngrok.io
的网址。当ngrok
正在运行时,它会将d83375e5.ngrok.io
上的HTTP和HTTPS请求转发到您的计算机端口3000
。
如果您使用https://${ENV['WEBHOOK_HOST']}/api/watch/outlookNotification
之类的notificationUrl,则在开发中,将环境变量WEBHOOK_HOST
设置为ngrok
提供的主机。在生产中,您不需要运行ngrok
;只需将WEBHOOK_HOST
设置为您服务器的可公开访问的主机。
答案 1 :(得分:0)
我参加聚会可能有点晚,但是我遇到了同样的问题。 Rails中的开发环境会阻止多个请求,这就是为什么您超时的原因。由于您正在等待Graph回送请求时的帖子回复,因此该请求将一直被阻止,直到您收到第一篇帖子的回复为止。
您似乎已经发现,在生产环境中运行时这不是问题,因为生产环境设置不会阻止多个请求。