启用Allow Skillset to read file data后,自定义WebApiSkill读取PDF遇NotFound错误
问题排查与解决方案
一、先解决WebApiSkill的NotFound错误
排查步骤:
- 检查Endpoint配置准确性:确认WebApiSkill的
uri是否完全匹配你的Python函数公网地址,比如Azure Function的地址格式是https://<函数应用名>.azurewebsites.net/api/<函数名>,别漏掉api/前缀,也不要写错函数名或域名。 - 验证权限配置:如果你的函数启用了密钥验证,必须在WebApiSkill的
httpHeaders里添加正确的授权头,比如{"x-functions-key": "<你的函数密钥>"},密钥错误或缺失会导致请求被拦截,部分场景下会返回404而非403。 - 确认输入映射有效性:临时关闭projections(或使用索引器的「测试技能集」功能),检查索引器处理的文档是否包含
file_data字段——如果该字段不存在,技能集请求可能因输入为空触发异常,间接导致404。 - 测试函数独立可用性:用Postman或curl构造符合技能集格式的请求(参考下方示例)直接调用函数,看是否能正常响应。如果直接调用也返回404,说明函数本身的路由或部署有问题。
示例测试请求体:
{ "values": [ { "recordId": "test1", "data": { "file_data": "<你的测试PDF base64字符串>" } } ] }
二、正确读取Blob原始PDF文件的流程
核心要点:
- 明确
file_data的格式:索引器传递的/document/file_data是base64编码的二进制文件内容,必须先解码才能处理。 - Python函数正确处理逻辑:解码base64字符串为字节流,再用PDF处理库(如PyPDF2、pdfplumber)读取内容,最后返回符合技能集要求的JSON格式。
示例Python函数代码:
import azure.functions as func import base64 import json from PyPDF2 import PdfReader import io def main(req: func.HttpRequest) -> func.HttpResponse: try: req_body = req.get_json() # 提取技能集传入的file_data record = req_body["values"][0] file_data_base64 = record["data"]["file_data"] # Base64解码为字节流 file_bytes = base64.b64decode(file_data_base64) pdf_stream = io.BytesIO(file_bytes) # 读取PDF文本内容 reader = PdfReader(pdf_stream) extracted_text = "" for page in reader.pages: page_text = page.extract_text() if page_text: extracted_text += page_text + "\n" # 返回符合技能集规范的响应 return func.HttpResponse( json.dumps({ "values": [ { "recordId": record["recordId"], "data": {"extracted_text": extracted_text}, "errors": [], "warnings": [] } ] }), mimetype="application/json" ) except Exception as e: # 异常处理,返回错误信息(生产环境可隐藏具体异常) record_id = record["recordId"] if "record" in locals() else "unknown" return func.HttpResponse( json.dumps({ "values": [ { "recordId": record_id, "data": {}, "errors": [{"message": f"处理失败: {str(e)}"}], "warnings": [] } ] }), status_code=500, mimetype="application/json" )
额外注意事项:
- 确保函数依赖的库(如PyPDF2)已在
requirements.txt中声明,部署时会自动安装。 - 若PDF文件较大,需调整Azure Function的内存配置和技能集的
timeout参数,避免超时。 - 开启函数的日志监控(Azure门户→函数应用→监控→日志),查看请求详情和执行异常,这是排查问题最直接的方式。
内容的提问来源于stack exchange,提问作者Mike B
相关产品推荐
相关产品推荐

