创建图形Webhook订阅,为什么会收到此消息? “响应必须完全匹配validationToken查询参数”

问题描述 投票:1回答:2

我是Graph的新手。我正在尝试订阅/ users中的更改。这是我的标题和POST到图表:

//HTTP POST
//Host: https://graph.microsoft.com/v1.0/subscriptions
//Content-Type:applicaton/json
//Authorization: {auth key}
{
"changeType":"updated"
,"clientState":"myClientState"
,"resource":"/users"
,"notificationUrl":"[ngrok URL tunneling back to my local debug api instance]"
,"expirationDateTime":"2020-05-23T04:30:28.2257768+00:00"
}

这是我的核心Web API上的相关代码,可从Graph获得响应:

// POST api/values
        public IHttpActionResult Post ([FromUri]string validationToken)
        {

            Debug.WriteLine("validationToken string is: " + validationToken);


            if (!String.IsNullOrEmpty(validationToken))
            {

                Debug.WriteLine("Token received, sending back token: " + validationToken);

                return Ok(validationToken);
            }
            else
            {
                //...
            }
    }

我已经通过邮递员对其进行了测试,并按预期将它收到的查询参数准确发送回去。当我将POST调用发送到Graph时,我的Web API会得到响应。它具有一个参数:

key: validationToken
value: 'Validation: Testing client application reachability for subscription Request-Id: ea95e0a8-55c6-42db-b7e6-441920ae9c15'

所以这就是我发回的邮件。我总是在以下情况下收到此错误:

{
  "error": {
    "code": "InvalidRequest",
    "message": "Subscription validation request failed. Response must exactly match validationToken query parameter.",
    "innerError": {
      "request-id": "ea95e0a8-55c6-42db-b7e6-441920ae9c15",
      "date": "2020-05-18T20:07:17"
    }
  }
}

我尝试了不同的编码,并确认我的Auth令牌有效,并且所有端点都可以互相访问。老实说,这看起来并不像我期望的验证令牌那样-甚至可以吗?我在POST正文中没有看到其他内容,也没有其他参数。这是包含查询参数的确切请求URI:

https://localhost:44391/api/values?validationToken=Validation%3a+Testing+client+application+reachability+for+subscription+Request-Id%3a+ea95e0a8-55c6-42db-b7e6-441920ae9c15
asp.net graph microsoft-graph asp.net-core-webapi
2个回答
1
投票

确保验证令牌以纯文本/文本内容类型返回。 EG:

public IHttpActionResult Post([FromUri] string validationToken) {
    Debug.WriteLine("validationToken string is: " + validationToken);

    if (!String.IsNullOrEmpty(validationToken)) {
        Debug.WriteLine("Token received, sending back token: " + validationToken);

        return this.ResponseMessage(new HttpResponseMessage(HttpStatusCode.OK) {
            Content = new StringContent(validationToken)
        });
    }
    else {
        return this.InternalServerError();
    }
}

1
投票

return Ok(validationToken);替换return Content(validationToken);

Ok希望参数是一个对象,并可能根据请求和管道配置来包装通过JSON或XML传递的内容。

内容期望参数为字符串并按原样返回。您可以使用postman collection来验证端点的验证实现,并查看sample以获取更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.