为什么来自 Postman 的 Azure 端点的 400 响应在 Alexa 控制台上运行良好?
Why a 400 response from Azure endpoint for Postman but works fine with the Alexa console?
我是开发 Alexa 技能的新手,所以我使用在网络上找到的示例作为托管在 Azure 上的 C# 端点。它与 Alexa 控制台一起正常工作,但是当我尝试使用 Postman 应用程序测试相同的端点时,我收到 400 错误。
当我使用 Alexa 控制台时,它会显示发送到端点的 JSON 输入和从端点接收的 JSON 输出。如果我复制 JSON 输入并将其粘贴到 Postman 并将其发送到同一端点,我会收到 400 错误。显然,我遗漏了一些东西。
以下是我的两个源文件和JSON输入。
RollTheDice.cs
public static class RollTheDice
{
[FunctionName("RollTheDice")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
var speechlet = new RollTheDiceSpeechlet();
return await speechlet.GetResponseAsync(req);
}
}
RollTheDiceSpeechlet.cs
public class RollTheDiceSpeechlet : SpeechletBase, ISpeechletWithContext
{
public SpeechletResponse OnIntent(IntentRequest intentRequest, Session session, Context context)
{
try
{
// Default to 6 sides if not specified
if (!int.TryParse(intentRequest.Intent.Slots["DiceType"].Value, out int numSides))
numSides = 6;
var rollResults = new Random().Next(Math.Max(1, numSides - 1)) + 1; // Account for random returning '0'
return new SpeechletResponse
{
ShouldEndSession = false,
OutputSpeech = new PlainTextOutputSpeech { Text = $"I rolled a {numSides} sided die and got a {rollResults}." }
};
}
catch (Exception ex)
{
return new SpeechletResponse
{
ShouldEndSession = false,
OutputSpeech = new PlainTextOutputSpeech { Text = ex.Message }
};
}
}
public SpeechletResponse OnLaunch(LaunchRequest launchRequest, Session session, Context context)
{
return new SpeechletResponse
{
ShouldEndSession = false,
OutputSpeech = new PlainTextOutputSpeech { Text = "Welcome to the Roll the Dice. Ask me to roll the dice." }
};
}
public void OnSessionEnded(SessionEndedRequest sessionEndedRequest, Session session, Context context)
{
return;
}
public void OnSessionStarted(SessionStartedRequest sessionStartedRequest, Session session, Context context)
{
return;
}
}
JSON 输入
同样,一切正常,但当我使用 Postman 对其进行测试时,出现 404 错误。
端点是我在 Visual Studio 201 中开发的 C# 无服务器函数。
当我在本地 运行 时,我 copy/paste Postman 应用程序中的 URL 并发送 post。请参阅随附的屏幕截图。
错误表明您缺少 Signature
和 SignatureCertChainUrl
headers。这些有助于保护您的端点并验证传入请求是否由 Alexa 发送。应拒绝来自其他来源的任何请求。当您通过测试控制台对其进行测试时,这些 headers 已包含在内并且您会获得成功的响应。
Headers:
Signature
SignatureCertChainUrl
验证传入请求分为两部分:
- 检查请求签名以验证请求的真实性。
- 检查请求时间戳以确保该请求不是旧请求。
有关验证请求是否由 Alexa 发送的更多信息here
我是开发 Alexa 技能的新手,所以我使用在网络上找到的示例作为托管在 Azure 上的 C# 端点。它与 Alexa 控制台一起正常工作,但是当我尝试使用 Postman 应用程序测试相同的端点时,我收到 400 错误。
当我使用 Alexa 控制台时,它会显示发送到端点的 JSON 输入和从端点接收的 JSON 输出。如果我复制 JSON 输入并将其粘贴到 Postman 并将其发送到同一端点,我会收到 400 错误。显然,我遗漏了一些东西。
以下是我的两个源文件和JSON输入。
RollTheDice.cs
public static class RollTheDice
{
[FunctionName("RollTheDice")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
var speechlet = new RollTheDiceSpeechlet();
return await speechlet.GetResponseAsync(req);
}
}
RollTheDiceSpeechlet.cs
public class RollTheDiceSpeechlet : SpeechletBase, ISpeechletWithContext
{
public SpeechletResponse OnIntent(IntentRequest intentRequest, Session session, Context context)
{
try
{
// Default to 6 sides if not specified
if (!int.TryParse(intentRequest.Intent.Slots["DiceType"].Value, out int numSides))
numSides = 6;
var rollResults = new Random().Next(Math.Max(1, numSides - 1)) + 1; // Account for random returning '0'
return new SpeechletResponse
{
ShouldEndSession = false,
OutputSpeech = new PlainTextOutputSpeech { Text = $"I rolled a {numSides} sided die and got a {rollResults}." }
};
}
catch (Exception ex)
{
return new SpeechletResponse
{
ShouldEndSession = false,
OutputSpeech = new PlainTextOutputSpeech { Text = ex.Message }
};
}
}
public SpeechletResponse OnLaunch(LaunchRequest launchRequest, Session session, Context context)
{
return new SpeechletResponse
{
ShouldEndSession = false,
OutputSpeech = new PlainTextOutputSpeech { Text = "Welcome to the Roll the Dice. Ask me to roll the dice." }
};
}
public void OnSessionEnded(SessionEndedRequest sessionEndedRequest, Session session, Context context)
{
return;
}
public void OnSessionStarted(SessionStartedRequest sessionStartedRequest, Session session, Context context)
{
return;
}
}
JSON 输入
同样,一切正常,但当我使用 Postman 对其进行测试时,出现 404 错误。 端点是我在 Visual Studio 201 中开发的 C# 无服务器函数。 当我在本地 运行 时,我 copy/paste Postman 应用程序中的 URL 并发送 post。请参阅随附的屏幕截图。
错误表明您缺少 Signature
和 SignatureCertChainUrl
headers。这些有助于保护您的端点并验证传入请求是否由 Alexa 发送。应拒绝来自其他来源的任何请求。当您通过测试控制台对其进行测试时,这些 headers 已包含在内并且您会获得成功的响应。
Headers:
Signature
SignatureCertChainUrl
验证传入请求分为两部分:
- 检查请求签名以验证请求的真实性。
- 检查请求时间戳以确保该请求不是旧请求。
有关验证请求是否由 Alexa 发送的更多信息here