gpt4 book ai didi

azure - Azure 机器人服务的 Directline 没有响应并被 CORS 策略阻止

转载 作者:行者123 更新时间:2023-12-03 04:49:21 24 4
gpt4 key购买 nike

我曾使用Bot Services sample来自 Microsoft 机器人服务示例。

调试后,网页没有显示任何内容。这是我的源代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Web Chat: Minimal bundle with Markdown</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<script src="https://cdn.botframework.com/botframework-webchat/latest/webchat-minimal.js"></script>

<style>
html,
body {
height: 100%;
}
body {
margin: 0;
}
#webchat {
height: 100%;
width: 100%;
}
</style>
</head>
<body>
<div id="webchat" role="main"></div>
<script>
(async function() {
const res = await fetch('https://csharpbotdw.azurewebsites.net/directline/token', { method: 'POST' });
const { token } = await res.json();
const markdownIt = window.markdownit();
window.WebChat.renderWebChat(
{
directLine: window.WebChat.createDirectLine({ token })

},
document.getElementById('webchat')
);
document.querySelector('#webchat > *').focus();
})().catch(err => console.error(err));
</script>
</body>
</html>

我只看到了错误提示

Access to fetch at 'https://csharpbotdw.azurewebsites.net/directline/token' from origin 'http://localhost:63191' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled. [http://localhost:63191/Test13122019]

最佳答案

显然,您的 Azure 应用服务尚未在托管代码的 Azure 应用服务的 CORS 设置中正确配置 CORS。我解决了a similar issue with detailed steps here ,请尝试一下,看看是否对您有帮助。

您获取 directLine token 的 URL 似乎有问题:https://csharpbotdw.azurewebsites.net/directline/token。每次我调用这个 URL 时都会收到 404 错误,似乎那里没有这样的 API。

如果您尚未在代码中实现此类 API,请在 .net 框架项目中尝试以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using Newtonsoft.Json;

namespace CoreBot.Controllers
{
[Route("api/token")]
public class TokenController : ApiController
{
public async Task<IHttpActionResult> token()
{
var secret = "<your bot channel directline secret>";

HttpClient client = new HttpClient();

HttpRequestMessage request = new HttpRequestMessage(
HttpMethod.Post,
$"https://directline.botframework.com/v3/directline/tokens/generate");

request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", secret);

var userId = $"dl_{Guid.NewGuid()}";

request.Content = new StringContent(
Newtonsoft.Json.JsonConvert.SerializeObject(
new { User = new { Id = userId } }),
Encoding.UTF8,
"application/json");

var response = await client.SendAsync(request);
string token = String.Empty;

if (response.IsSuccessStatusCode)
{
var body = await response.Content.ReadAsStringAsync();
token = JsonConvert.DeserializeObject<DirectLineToken>(body).token;
}

var config = new ChatConfig()
{
token = token,
userId = userId
};

return Ok(config);
}

}


public class DirectLineToken
{
public string conversationId { get; set; }
public string token { get; set; }
public int expires_in { get; set; }
}
public class ChatConfig
{
public string token { get; set; }
public string userId { get; set; }
}
}

您可以在此处获取机器人 channel 直接 secret : enter image description here enter image description here

要将其集成到您的项目中,请在项目中的 Controller 文件夹下创建一个 TokenController.cs 文件,并将上面的代码粘贴到其中: enter image description here

将项目发布到 Azure 后,您将可以通过 URL :https://csharpbotdw.azurewebsites.net/api/token 通过 post 方法获取 token 。

我本地的测试结果: enter image description here

启用 CORS 并将代码发布到 Azure 后,您可以使用 HTML 代码连接到您的机器人:

    <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Web Chat: Minimal bundle with Markdown</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

<script src="https://cdn.botframework.com/botframework-webchat/latest/webchat-minimal.js"></script>

<style>
html,
body {
height: 100%;
}
body {
margin: 0;
}
#webchat {
height: 100%;
width: 100%;
}
</style>
</head>
<body>
<div id="webchat" role="main"></div>
<script>
(async function() {
const res = await fetch('https://csharpbotdw.azurewebsites.net/api/token', { method: 'POST' });
const { token } = await res.json();

window.WebChat.renderWebChat(
{
directLine: window.WebChat.createDirectLine({ token })

},
document.getElementById('webchat')
);
document.querySelector('#webchat > *').focus();
})().catch(err => console.error(err));
</script>
</body>
</html>

关于azure - Azure 机器人服务的 Directline 没有响应并被 CORS 策略阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59316890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com