Я написал минимальный API в C#, работающем на .net 8. Предполагается, что он должен вернуть одну запись и обновить таблицу в нашей базе данных, указывая на то, что запись была обработана. Характер потребляющего приложения заключается в том, что я могу отправлять только одну запись за раз. Чтобы все было просто, я сначала не упоминал в своем первоначальном вопросе, что использую задачу сценария в SSI, чтобы назвать сторонним API, который запускает рабочий процесс в приложении по потреблению. Я использовал SSIS, чтобы я мог легко пройти через свои данные и вызвать API стороннего API для каждой записи. Сторонний рабочий процесс использует мой API для запроса нашего DB, но позволяет только одну запись за раз. Это все работает и успешно проверяется в почте, чтобы получить первую запись, возвращенную. Когда я запускаю свои процессы базы данных отдельно, которые упоминаются в коде API, возвращаются правильные данные, что заставляет меня полагать, что данные где -то кэшируются. SSIS проходит через записи в моей базе данных, но я думаю, что кэширование где-то происходит, так что оно не обновляет данные. Заголовки "Прагма. Я не думаю, что проблема кэширования в IIS, так что, вероятно, это в моем коде C#.
Я пробовал ответный разбор и outputCache промежуточное программное обеспечение в моем коде C#, без удачи. Моей последней попыткой было использование службы addmvc с nostore , установленным в True, и местоположение, установленное в responsecachelocation.none . Это тоже не работает. Как отключить кэширование в моем API?
Вот моя программа.using TalkDeskAPI_WithReply;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.SqlClient;
using System.Data;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAuthorization();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddMvc(o => {
o.Filters.Add(new ResponseCacheAttribute { NoStore = true, Location = ResponseCacheLocation.None });
});
// hard coded connection string for development/testing
string ConnStr = "Data Source = xx.xx.xxx.xxx,xxxx; Initial Catalog = XXXX; TrustServerCertificate = True; User ID = XXXXXXX; Password = XXXXXXXX";
var app = builder.Build();
app.UseAuthorization();
// Middleware to validate apiKey - works and not relevant here
app.UseAPIKeyMiddleware();
app.UseResponseCaching();
using (SqlConnection connection = new SqlConnection(ConnStr))
{
SqlCommand command = new SqlCommand("dbo.Get_Data_For_API_Test_Data_3", connection);
command.CommandType = CommandType.StoredProcedure;
command.Connection.Open();
command.ExecuteNonQuery();
List result = new List();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Contact c = new Contact();
c.c_Id = (Int64)reader["c_Id"];
c.member_PhoneNumber = (string)reader["member_PhoneNumber"];
c.member_FirstName = (string)reader["member_FirstName"];
c.member_LastName = (string)reader["member_LastName"];
c.member_ID = (string)reader["member_ID"];
c.Message = (string)reader["message"];
result.Add(c);
}
}
command.Connection.Close();
command.Connection.Dispose();
// Get Contact Item
app.MapGet("/api/Contact", async () => result).CacheOutput (o =>
{
o.Expire(TimeSpan.FromMilliseconds(1));
o.NoCache();
});
app.Run();
< /code>
Вот мой код задачи сценария SSIS C#, который вызывает сторонний API, который запускает рабочий процесс, который запрашивает наш DB через мой API (код, указанный выше). Этот код работает, но был запрошен @mjwills в комментариях: < /p>
#region Namespaces
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
#endregion
namespace ST_5c51b49b0eb04bbaa529180a116d1432
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
SendPost().GetAwaiter();
}
public async System.Threading.Tasks.Task SendPost()
{
try
{
string Auth = GetToken().GetAwaiter().GetResult();
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.talkdeskapp.com/flows/xxxxx ... teractions");
request.Headers.Add("Authorization", "Bearer " + Auth);
var content = new StringContent("{}", null, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
catch (Exception ex)
{
Console.Write(ex.Message);
Console.Write(ex.InnerException.Message);
}
}
private async Task GetToken()
{
try
{
string AuthToken = "";
ServicePointManager.SecurityProtocol = (SecurityProtocolType)768 | (SecurityProtocolType)3072;
var client = new HttpClient();
Uri baseUri = new Uri("https://xxxxxxx.talkdeskid.com");
client.BaseAddress = baseUri;
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.ConnectionClose = true;
var collection = new List();
collection.Add(new KeyValuePair("grant_type", "client_credentials"));
var content = new FormUrlEncodedContent(collection);
string clientId = "xxxxxxxxxxxxxxxxxxxxxx";
string clientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
var authenticationString = $"{clientId}:{clientSecret}";
var base64EncodedAuthenticationString = Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(authenticationString));
var requestMessage = new HttpRequestMessage(HttpMethod.Post, "/oauth/token");
requestMessage.Headers.Add("Authorization", "Basic " + base64EncodedAuthenticationString);
requestMessage.Content = content;
var response = await client.SendAsync(requestMessage);
dynamic tokenResponse = await response.Content.ReadAsStringAsync();
dynamic obj = JsonConvert.DeserializeObject(tokenResponse);
AuthToken = obj.access_token;
if (response.IsSuccessStatusCode)
{
return AuthToken;
}
else
{
Console.WriteLine("Failed Authorization");
return AuthToken;
}
}
catch (Exception ex)
{
Console.Write(ex.Message);
Console.Write(ex.InnerException.Message);
return "";
Подробнее здесь: https://stackoverflow.com/questions/796 ... inimal-api
Как выключить кэширование в минимальном API? ⇐ C#
Место общения программистов C#
-
Anonymous
1751777859
Anonymous
Я написал минимальный API в C#, работающем на .net 8. Предполагается, что он должен вернуть одну запись и обновить таблицу в нашей базе данных, указывая на то, что запись была обработана. Характер потребляющего приложения заключается в том, что я могу отправлять только одну запись за раз. Чтобы все было просто, я сначала не упоминал в своем первоначальном вопросе, что использую задачу сценария в SSI, чтобы назвать сторонним API, который запускает рабочий процесс в приложении по потреблению. Я использовал SSIS, чтобы я мог легко пройти через свои данные и вызвать API стороннего API для каждой записи. Сторонний рабочий процесс использует мой API для запроса нашего DB, но позволяет только одну запись за раз. Это все работает и успешно проверяется в почте, чтобы получить первую запись, возвращенную. Когда я запускаю свои процессы базы данных отдельно, которые упоминаются в коде API, возвращаются правильные данные, что заставляет меня полагать, что данные где -то кэшируются. SSIS проходит через записи в моей базе данных, но я думаю, что кэширование где-то происходит, так что оно не обновляет данные. Заголовки "Прагма. Я не думаю, что проблема кэширования в IIS, так что, вероятно, это в моем коде C#.
Я пробовал ответный разбор и outputCache промежуточное программное обеспечение в моем коде C#, без удачи. Моей последней попыткой было использование службы addmvc с nostore , установленным в True, и местоположение, установленное в responsecachelocation.none . Это тоже не работает. Как отключить кэширование в моем API?
Вот моя программа.using TalkDeskAPI_WithReply;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Data.SqlClient;
using System.Data;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAuthorization();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddMvc(o => {
o.Filters.Add(new ResponseCacheAttribute { NoStore = true, Location = ResponseCacheLocation.None });
});
// hard coded connection string for development/testing
string ConnStr = "Data Source = xx.xx.xxx.xxx,xxxx; Initial Catalog = XXXX; TrustServerCertificate = True; User ID = XXXXXXX; Password = XXXXXXXX";
var app = builder.Build();
app.UseAuthorization();
// Middleware to validate apiKey - works and not relevant here
app.UseAPIKeyMiddleware();
app.UseResponseCaching();
using (SqlConnection connection = new SqlConnection(ConnStr))
{
SqlCommand command = new SqlCommand("dbo.Get_Data_For_API_Test_Data_3", connection);
command.CommandType = CommandType.StoredProcedure;
command.Connection.Open();
command.ExecuteNonQuery();
List result = new List();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
Contact c = new Contact();
c.c_Id = (Int64)reader["c_Id"];
c.member_PhoneNumber = (string)reader["member_PhoneNumber"];
c.member_FirstName = (string)reader["member_FirstName"];
c.member_LastName = (string)reader["member_LastName"];
c.member_ID = (string)reader["member_ID"];
c.Message = (string)reader["message"];
result.Add(c);
}
}
command.Connection.Close();
command.Connection.Dispose();
// Get Contact Item
app.MapGet("/api/Contact", async () => result).CacheOutput (o =>
{
o.Expire(TimeSpan.FromMilliseconds(1));
o.NoCache();
});
app.Run();
< /code>
Вот мой код задачи сценария SSIS C#, который вызывает сторонний API, который запускает рабочий процесс, который запрашивает наш DB через мой API (код, указанный выше). Этот код работает, но был запрошен @mjwills в комментариях: < /p>
#region Namespaces
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
#endregion
namespace ST_5c51b49b0eb04bbaa529180a116d1432
{
[Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute]
public partial class ScriptMain : Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase
{
SendPost().GetAwaiter();
}
public async System.Threading.Tasks.Task SendPost()
{
try
{
string Auth = GetToken().GetAwaiter().GetResult();
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.talkdeskapp.com/flows/xxxxxxxxxxxxxx/interactions");
request.Headers.Add("Authorization", "Bearer " + Auth);
var content = new StringContent("{}", null, "application/json");
request.Content = content;
var response = await client.SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
catch (Exception ex)
{
Console.Write(ex.Message);
Console.Write(ex.InnerException.Message);
}
}
private async Task GetToken()
{
try
{
string AuthToken = "";
ServicePointManager.SecurityProtocol = (SecurityProtocolType)768 | (SecurityProtocolType)3072;
var client = new HttpClient();
Uri baseUri = new Uri("https://xxxxxxx.talkdeskid.com");
client.BaseAddress = baseUri;
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.ConnectionClose = true;
var collection = new List();
collection.Add(new KeyValuePair("grant_type", "client_credentials"));
var content = new FormUrlEncodedContent(collection);
string clientId = "xxxxxxxxxxxxxxxxxxxxxx";
string clientSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
var authenticationString = $"{clientId}:{clientSecret}";
var base64EncodedAuthenticationString = Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(authenticationString));
var requestMessage = new HttpRequestMessage(HttpMethod.Post, "/oauth/token");
requestMessage.Headers.Add("Authorization", "Basic " + base64EncodedAuthenticationString);
requestMessage.Content = content;
var response = await client.SendAsync(requestMessage);
dynamic tokenResponse = await response.Content.ReadAsStringAsync();
dynamic obj = JsonConvert.DeserializeObject(tokenResponse);
AuthToken = obj.access_token;
if (response.IsSuccessStatusCode)
{
return AuthToken;
}
else
{
Console.WriteLine("Failed Authorization");
return AuthToken;
}
}
catch (Exception ex)
{
Console.Write(ex.Message);
Console.Write(ex.InnerException.Message);
return "";
Подробнее здесь: [url]https://stackoverflow.com/questions/79686336/how-do-you-turn-off-caching-in-a-minimal-api[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия