Closed javadmjt closed 2 years ago
با تغییر تنظیم ConfigureStorage به UseDistributedCache درست شد.
.ConfigureStorage(builder => builder.UseMemoryCache());
قسمت بالا تبدیل قسمت پایین شود
.ConfigureStorage(builder => builder.UseDistributedCache());
درود
مموری کش، صرفا برای آزمایش برنامه توسط مصرف کننده درست شده. در قسمت آموزش تنظیمات، کاملا واضح توضیح داده شده که حافظه مموری کش همون طور که از اسمش پیداست پایدار نیست و نباید در محیط واقعی و نهایی استفاده بشه. همچنین حتی اگر از DistributedCache هم استفاده میکنید باید اطمینان حاصل کنید که این نوع مخزن، به یک پایگاه داده ثابت متصل هست. چون اگر هاست شما از بین بره و یا وب سایت شما به هر دلیلی خاموش بشه،اطلاعات داخل مموری هم از بین میره.
موفق باشید.
سلام و ادب برای استفاده از UseDistributedCache در ASP.NET webfrom چطور باید IDistributedCache رو فراخوانی کنیم / نمونه کدی دارید؟
درود
سلام و ادب برای استفاده از UseDistributedCache در ASP.NET webfrom چطور باید IDistributedCache رو فراخوانی کنیم / نمونه کدی دارید؟
متوجه منظور شما از فراخوانی نمیشم.
برای بکارگیری UseDistributedCache در ASP.NET webfrom (.NET 4.5) نمونه کدی دارید؟ (آیا ملاحظه خاصی داره) با این خطا مواجه می شم
Unable to resolve service for type 'Microsoft.Extensions.Caching.Distributed.IDistributedCache' while attempting to activate 'Parbad.Storage.Cache.DistributedCache.DistributedCacheStorage'.
این مقاله انواع Distributed Cache رو برای شما توضیح داده که میتونید استفاده کنید https://learn.microsoft.com/en-us/aspnet/core/performance/caching/distributed?view=aspnetcore-7.0
ضمن تشکر در کانفیگ قطعه کد زیر رو اضافه کردم
.ConfigureStorage(builder => builder.UseDistributedCache())
و در کلاس Startup تابع ConfigureServices قطعه کد زیر
services.AddDistributedSqlServerCache(options => { options.ConnectionString = Config.ConnectionString; options.SchemaName = "dbo"; options.TableName = "CacheStore"; });
ولی همچنان خطای زیر رو دارم
Unable to resolve service for type 'Microsoft.Extensions.Caching.Distributed.IDistributedCache' while attempting to activate 'Parbad.Storage.Cache.DistributedCache.DistributedCacheStorage'.
در صورت تمایل، کدهای کلاس Startup رو به طور کامل اینجا بزارید تا بررسی کنم
[assembly: OwinStartup("Brand", typeof(WebApp.Startup))] namespace WebApp { public class Startup {
public void ConfigureServices(IServiceCollection services)
{
var parbadBuilder = ParbadConfig.Configure();
services.AddDistributedSqlServerCache(options =>
{
options.ConnectionString = Config.ConnectionString;
options.SchemaName = "dbo";
options.TableName = "CacheStore";
});
}
public void Configuration(IAppBuilder app)
{
}
}
}
public static class ParbadConfig
{
public static ParbadData Configure()
{
var parbadData = new ParbadData()
{
Saderat_TerminalId = General.GetTokenFromJson(json, "Accounts.Saderat_TerminalId").To
ParbadBuilder.CreateDefaultBuilder()
.ConfigureGateways(gateways =>
{
gateways
.AddSepehr()
.WithAccounts(accounts =>
{
accounts.AddInMemory(account =>
{
account.TerminalId = parbadData.Saderat_TerminalId.To<long>();
});
});
})
.ConfigureHttpContext(builder => builder.UseOwinFromCurrentHttpContext())
.ConfigureStorage(builder => builder.UseDistributedCache())
.Build();
return parbadData;
}
}
ظاهرا ServiceCollection که شما دارید استفاده میکنید رو به پَرباد معرفی نکردید و به همین خاطر پَرباد اطلاعی از سرویسی که درخواست میکنه نداره. متد ParbadBuilder.CreateDefaultBuilder یک ورودی از شما میگیره که میتونید سرویس ها رو بهش بدید. سرویس ها رو از داخل متد ConfigureServices پاس بدید به داخل کلاسی که پَرباد رو تنظیم کردید
ضمن تشکر از پاسخگویی / چون سایت چند مستاجره است هر زیردامنه دارای یک شماره حساب است / با این روال راهکاری هست تا فراخوانی CreateDefaultBuilder بعد از فراخوانی کلید هر دامنه انجام شود؟
متوجه منظور شما از فراخوانی کلید دامنه نمیشم. اما اگر منظور شما این هست که چندین حساب مختلف وجود دارن، شما میتونید از قابلیت چند حسابی استفاده کنید تا حساب ها رو ثبت و تنظیم کنید، سپس هنگام ارسال درخواست پرداخت، حساب مورد نظر رو معرفی کنید،
https://github.com/Sina-Soltani/Parbad/wiki/Configuration#adding-multiple-accounts-for-a-gateway
مشابه زيرساخت یک وبلاگ كه دارای چندين وبلاگ است، زيرساخت ما هم چندين دامنه (وبلاگ) داره كه ادمین هر دامنه شماره حساب اختصاصی خودش رو معرفي مي كنه
شما در چه مرحله ای امکان تشخیص وبلاگ رو دارید؟
با روتينگ مشخص مي شود www.test.ir/blog1 www.test.ir/blog2
پس تنظیم حسابها به صورت استاتیک برای شما کاربردی نداره. برای این کار شما باید تنظیم حسابها رو در حالت داینامیک انجام بدید تا هنگام عملیات پرداخت، حساب مورد نظر در همون لحظه به صورت داینامیک از پایگاه داده یا هر منبعی که در نظر دارید خوانده بشه.
حسابها رو از هر طریقی که در نظر دارید تزریق کنید به داخل کلاسی که در بالا به عنوان نمونه آورده شده. و قبل از اضافه کردن حساب، با توجه به امکانات دات نت از طریق آدرس تصمیم بگیرید که چه حسابی باید لود بشه تا اضافه بشه.
ممنونم / الان دو سوال همچنان موجود هست
1- آیا در هر فراخوانی پرداخت، من می تونم تابع ParbadBuilder.CreateDefaultBuilder رو مجددا صدا بزنم؟ بجز مسئله performance آیا نکته دیگه ای داره؟ 2- در زمان استفاده از UseMemoryCache مشکلی نیست (بجز این مورد مهم که بعضی از پرداخت ها ناموفق اعلام می شود) اما زمانی که از UseDistributedCache استفاده می کنم در زمان پرداخت با خطای زیر مواجه می شم، راهکار چیست؟
Unable to resolve service for type 'Microsoft.Extensions.Caching.Distributed.IDistributedCache' while attempting to activate 'Parbad.Storage.Cache.DistributedCache.DistributedCacheStorage'.
۱. بله، در صورتی که واقعا نیاز به انجام چنین کاری باشه میتونید. ۲. همونطور که گفتم، این خطا فقط زمانی اتفاق میوفته که شما در تزریق وابستگی مشکلاتی رو در سیستم داشته باشید و این رو باید خودتون پیگیری کنید، چون من از برنامه شما اطلاعی ندارم. ظاهرا شما هنگام تنظیمات برنامه، ۲ تا تزریق وابستگی رو دارید استفاده میکنید که از همدیگه خبری ندارن و به همین خاطر پَرباد داره به شما میگه که این سرویس مورد نظر رو پیدا نمیکنه.
سلام و احترام
بعد از انتقال به هاست جدید یک در میون با خطای No invoice found with the token مواجه میشم. در هاست قبلی هیچ خطایی نداشتم
تو یکی دو تا issue دیگه دیدم که توضیح دادین مربوط به کد نویسی برنامه هست. میخواستم ببینم احتمال داره بخاطر محدودیت خاصی روی هاست و سرور باشه که این خطا داده میشه؟ اگر بخاطر محدودیت هست چه محدودیتی میتونه باعث این خطا بشه؟