我是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
答案 0 :(得分:1)
将return Ok(validationToken);
替换为return Content(validationToken);
。
Ok希望参数是一个对象,并可能根据请求和管道配置来包装通过JSON或XML传递的内容。
Content希望参数为字符串并按原样返回。 您可以使用postman collection来验证端点的验证实现,并查看sample以获取更多信息。
答案 1 :(得分: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();
}
}