So implementieren Sie StreamResponse in ASP.NETC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 So implementieren Sie StreamResponse in ASP.NET

Post by Anonymous »

Dies ist eine ASP.NET-API-Funktion, um Echtzeit-Chatbot mit QWEN2.5 Local Setup mit Fastapi zu verarbeiten.
Dies ist der aktuelle Code, aber StreamResponse funktioniert nicht richtig. Code? < /p>
[Authorize]
[HttpPost("prompt")]
public async Task Prompt(PromptRequest request)
{
Response.ContentType = "text/plain";
Response.StatusCode = 200;

try
{
await HttpContext.Response.StartAsync(default).ConfigureAwait(true);

var userEmail = User.Claims.FirstOrDefault(c => c.Type.EndsWith("emailaddress"))?.Value;
if (string.IsNullOrEmpty(userEmail))
{
Response.StatusCode = (int)ErrorType.Unknown;
await Response.WriteAsync(ErrorType.Unknown.ToString());
return;
}

var user = await _context.Users
.Include(u => u.ChatbotHistories)
.Include(u => u.ChatbotCache)
.FirstOrDefaultAsync(u => u.EmailAddr == userEmail);

if (user == null)
{
Response.StatusCode = (int)ErrorType.UserNotFound;
await Response.WriteAsync(ErrorType.UserNotFound.ToString());
return;
}

var history = user.ChatbotHistories?.FirstOrDefault(c => c.ChatId == request.Id);
List his = history?.HistoryFilePath == null || user.ChatbotCache?.LastId == request.Id
? new List()
: (List)(JsonConvert.DeserializeObject(
System.IO.File.ReadAllText(history.HistoryFilePath)
) ?? new List());

var qwenAPI = await _context.EnvValues.AsNoTracking()
.FirstOrDefaultAsync(e => e.Type == EnvType.QWEN_API_URL);
var url = qwenAPI?.Value ?? "";

if (user.ChatbotCache != null && user.ChatbotCache.LastId != request.Id)
{
try { await _httpClient.GetAsync($"{url}/del-history?id={user.ChatbotCache.LastId}"); }
catch { }
}

var id = string.IsNullOrEmpty(request.Id) ? $"{Guid.NewGuid()}" : request.Id;

if (user.ChatbotCache == null)
{
await _context.ChatbotCaches.AddAsync(new ChatbotCache { User = user, LastId = id });
}
else
{
user.ChatbotCache.LastId = id;
}

await _context.SaveChangesAsync();

using var requestMessage = new HttpRequestMessage(HttpMethod.Post, url)
{
Content = new StringContent(JsonConvert.SerializeObject(new
{
Id = id,
Query = request.Query,
History = his,
Rag = request.Rag ?? false,
}), Encoding.UTF8, "application/json")
};

using var response = await _httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead);

if (!response.IsSuccessStatusCode)
{
Response.StatusCode = (int)ErrorType.QwenServerError;
await Response.WriteAsync(ErrorType.QwenServerError.ToString());
return;
}

var stream = await response.Content.ReadAsStreamAsync();
using var reader = new StreamReader(stream, Encoding.UTF8);
using var writer = new StreamWriter(Response.BodyWriter.AsStream(true), Encoding.UTF8, leaveOpen: true);
writer.AutoFlush = true;

string generatedText = "";
Console.WriteLine("Success");

char[] buffer = new char[1024];
while (!reader.EndOfStream)
{
int readCount = await reader.ReadAsync(buffer, 0, buffer.Length);
if (readCount > 0)
{
var chunk = new string(buffer, 0, readCount);
generatedText += chunk;
await writer.WriteAsync(chunk).ConfigureAwait(true);
await writer.FlushAsync(default(CancellationToken)).ConfigureAwait(true);
await Response.BodyWriter.FlushAsync(default(CancellationToken)).ConfigureAwait(true);

Console.Write(chunk);
}
}
reader.Close();
writer.Close();
await Response.CompleteAsync().ConfigureAwait(true);

his.Add((request.Query, generatedText));

var path = $"Chatbot/{id}.txt";
Directory.CreateDirectory(Path.GetDirectoryName(path) ?? "Chatbot");
System.IO.File.WriteAllText(path, JsonConvert.SerializeObject(his));

if (history == null)
{
await _context.ChatbotHistories.AddAsync(new ChatbotHistory
{
User = user,
ChatId = id,
Title = request.Query,
HistoryFilePath = path
});
}

await _context.SaveChangesAsync();
}
catch (Exception ex)
{
_logger.LogError(ex, "Error prompting");
Response.StatusCode = (int)ErrorType.Unknown;
await Response.WriteAsync(ErrorType.Unknown.ToString());
}
}
< /code>
Das Hauptproblem ist, dass die Abruffunktion des Frontend anfänglich keinen Antwortheader erhält und erst nach allen generierten Textdaten alle formierten Daten empfängt.
Was sind die Fehler und Lösungen, um zu lösen sie?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post