Azure QnA Service调用报错:CLR/System.TypeInitializationException
问题分析
从报错信息和代码来看,核心问题是你混淆了环境变量名称与QnA服务的实际密钥/端点值。代码中endpointVar、endpointKeyVar、kbIdVar这三个常量应该是环境变量的名称,但你误将QnA的EndpointKey(03947ac53fc346adaff6a52e5a4adf25)直接赋值给了endpointKeyVar,导致Environment.GetEnvironmentVariable()无法找到对应名称的环境变量,返回null,触发了静态构造函数中的异常。
解决方案
以下两种方案任选其一:
方案一:使用环境变量(推荐生产环境)
1. 修正代码中的常量定义
将三个常量改为你要使用的环境变量名称(自定义即可,比如:):
private const string endpointVar = "QNA_ENDPOINT"; private const string endpointKeyVar = "QNA_ENDPOINT_KEY"; private const string kbIdVar = "QNA_KB_ID";
2. 设置对应环境变量
根据你的操作系统执行对应的命令:
- Windows:打开命令提示符,执行以下命令(替换为你的实际值),设置后需重启IDE/终端生效:
setx QNA_ENDPOINT "你的QnA服务端点URL" setx QNA_ENDPOINT_KEY "你的QnA端点密钥" setx QNA_KB_ID "你的知识库ID" - Linux/macOS:在终端执行以下命令,若需永久生效可将命令添加到
~/.bashrc或~/.zshrc文件中:export QNA_ENDPOINT="你的QnA服务端点URL" export QNA_ENDPOINT_KEY="你的QnA端点密钥" export QNA_KB_ID="你的知识库ID"
方案二:直接硬编码值(仅用于测试,不推荐生产)
如果只是快速测试,可以跳过环境变量,直接将QnA的实际值赋值给静态变量,同时去掉环境变量检查逻辑:
// 替换原有的const和readonly定义 private static readonly string endpoint = "你的QnA服务端点URL"; private static readonly string endpointKey = "你的QnA端点密钥"; private static readonly string kbId = "你的知识库ID"; // 可删除静态构造函数中的环境变量检查代码
额外优化点
你的请求JSON使用了单引号,虽然部分解析器支持,但标准JSON要求使用双引号,建议修正:
string question = @"{""question"": ""Is the QnA Maker Service free?"",""top"": 3}";
内容的提问来源于stack exchange,提问作者hamzah jazi
相关产品推荐
相关产品推荐

