Как реализовать StreamResponse в asp.netC#

Место общения программистов C#
Ответить
Anonymous
 Как реализовать StreamResponse в asp.net

Сообщение Anonymous »

Это функция API API ASP.NET для обработки чат-бота в реальном времени с локальной установкой QWEN2.5 с FastAPI.
Это текущий код, но StreamResponse не работает правильно.
Как оптимизировать это Код? < /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>
Основная задача - это функция Fetch Frontend не получает заголовок ответа изначально и получает только все формированные данные после всего сгенерированного текста.
Какие ошибки и решения для решения они?

Подробнее здесь: https://stackoverflow.com/questions/794 ... in-asp-net
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»