You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET中如何持久化OpenAI Assistant实例以实现连续交互?

ASP.NET Session保存OpenAI Assistant实例序列化后为null的解决方法

问题描述

在ASP.NET应用中尝试用Session保存AIHelper类里的Assistant和AssistantClient实例,以复用对话历史,但序列化反序列化后这两个属性始终为null,无法复用原有实例。

核心原因

  1. Azure OpenAI客户端类不可序列化:AzureOpenAIClient、AssistantClient包含底层HTTP连接、状态管理等非序列化资源,JsonConvert默认会跳过这些无法序列化的类型,导致反序列化后对应属性为null。
  2. 无需保存完整实例:Assistant的对话历史实际存储在OpenAI服务器端,只需保存Assistant的ID即可恢复会话,不需要保存整个实例对象。

解决方案

修改AIHelper类,仅保存可序列化的关键标识信息(如Assistant ID、模型名称、API端点),反序列化后重新初始化客户端并通过ID获取已存在的Assistant。

修改后的AIHelper类

public class AIHelper
{
    // 仅保存可序列化的关键配置与标识
    public string? AssistantId { get; set; }
    public string ModelName { get; set; }
    public string ApiEndpoint { get; set; }

    // 客户端与Assistant实例不参与序列化,按需初始化
    [JsonIgnore]
    private AzureOpenAIClient? _client;
    [JsonIgnore]
    public OpenAI.Assistants.Assistant? OpenaiAssistant { get; private set; }
    [JsonIgnore]
    public OpenAI.Assistants.AssistantClient? OpenaiAssistantClient { get; private set; }

    public AIHelper(string modelName, string apiEndpoint)
    {
        ModelName = modelName;
        ApiEndpoint = apiEndpoint;
    }

    // 初始化或恢复AI会话
    public void InitializeOrRestoreSession(AzureKeyCredential azureKeyCredentials, AzureOpenAIClientOptions? options = null)
    {
        // 重新创建Azure OpenAI客户端
        _client = new AzureOpenAIClient(ApiEndpoint, azureKeyCredentials, options);
        OpenaiAssistantClient = _client.GetAssistantClient();

        if (!string.IsNullOrEmpty(AssistantId))
        {
            // 通过保存的ID获取已存在的Assistant
            OpenaiAssistant = OpenaiAssistantClient.GetAssistant(AssistantId);
        }
        else
        {
            // 首次创建Assistant并保存ID
            OpenaiAssistant = OpenaiAssistantClient.CreateAssistant(ModelName);
            AssistantId = OpenaiAssistant.Id;
        }
    }
}

修改后的Session序列化反序列化逻辑

// 从配置文件读取敏感信息(避免硬编码)
var modelName = _configuration["AzureOpenAI:ModelName"];
var apiEndpoint = _configuration["AzureOpenAI:ApiEndpoint"];
var apiKey = _configuration["AzureOpenAI:ApiKey"];
var credentials = new AzureKeyCredential(apiKey);

AIHelper aiHelper;
var aiHelperJson = _httpContextAccessor.HttpContext.Session.GetString("AIHelper");

if (string.IsNullOrEmpty(aiHelperJson))
{
    // 首次初始化AIHelper并创建会话
    aiHelper = new AIHelper(modelName, apiEndpoint);
    aiHelper.InitializeOrRestoreSession(credentials);
    _httpContextAccessor.HttpContext.Session.SetString("AIHelper", JsonConvert.SerializeObject(aiHelper));
}
else
{
    // 反序列化后重新初始化客户端与Assistant
    aiHelper = JsonConvert.DeserializeObject<AIHelper>(aiHelperJson);
    aiHelper.InitializeOrRestoreSession(credentials);
}

额外注意事项

  • 敏感信息(如API密钥)不要序列化到Session中,应存储在配置文件或密钥管理服务中,避免数据泄露。
  • Session存储轻量标识信息而非重型实例,能提升Session的性能与安全性。

内容的提问来源于stack exchange,提问作者Sankaranarayanan Rajkumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:46:05