Compare commits

..

No commits in common. "1a6db72d7a542c424f16d93b8f68f40ab5ea23de" and "bca383c4d0e2683ba0f18f00effa4649a545dca6" have entirely different histories.

4 changed files with 16 additions and 35 deletions

View File

@ -1,6 +1,5 @@
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using sodoff.Model;
namespace sodoff.Attributes;
@ -13,9 +12,6 @@ public class VikingSession : Attribute, IAsyncActionFilter {
public Modes Mode { get; set; } = Modes.VIKING;
public bool UseLock = false;
private static Dictionary<string, SemaphoreSlim> semaphores = new();
private static SemaphoreSlim dictSemaphore = new(1, 1);
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) {
DBContext ctx = context.HttpContext.RequestServices.GetService(typeof(DBContext)) as DBContext;
@ -48,16 +44,15 @@ public class VikingSession : Attribute, IAsyncActionFilter {
// NOTE: we can't refer to session.User / session.Viking here,
// because it may cause to ignore modifications from the threads we are waiting for
// we can use its only after vikingMutex.WaitOne()
string semKey = "SoDOffViking:" + userVikingId;
SemaphoreSlim semaphore = await GetSemaphore(semKey);
Mutex vikingMutex = new Mutex(false, "SoDOffViking:" + userVikingId);
try {
await semaphore.WaitAsync();
vikingMutex.WaitOne();
context.ActionArguments["user"] = session.User;
context.ActionArguments["viking"] = session.Viking;
await next();
} finally {
semaphore.Release();
await RemoveSemaphore(semKey, semaphore);
vikingMutex.ReleaseMutex();
}
} else {
context.ActionArguments["user"] = session.User;
@ -65,22 +60,4 @@ public class VikingSession : Attribute, IAsyncActionFilter {
await next();
}
}
private static async Task<SemaphoreSlim> GetSemaphore(string key) {
await dictSemaphore.WaitAsync();
if (!semaphores.TryGetValue(key, out SemaphoreSlim semaphore)) {
semaphore = new SemaphoreSlim(1, 1);
semaphores.Add(key, semaphore);
}
dictSemaphore.Release();
return semaphore;
}
private static async Task RemoveSemaphore(string key, SemaphoreSlim sem) {
await dictSemaphore.WaitAsync();
if (sem.CurrentCount == 1) {
semaphores.Remove(key);
}
dictSemaphore.Release();
}
}

View File

@ -570,7 +570,7 @@ public class ContentController : Controller {
[HttpPost]
[Produces("application/xml")]
[Route("V2/ContentWebService.asmx/CreatePet")]
[VikingSession(UseLock = true)]
[VikingSession]
public IActionResult CreatePet(Viking viking, [FromForm] string request) {
RaisedPetRequest raisedPetRequest = XmlUtil.DeserializeXml<RaisedPetRequest>(request);
// TODO: Investigate SetAsSelectedPet and UnSelectOtherPets - they don't seem to do anything
@ -602,6 +602,7 @@ public class ContentController : Controller {
if (raisedPetRequest.SetAsSelectedPet == true) {
viking.SelectedDragon = dragon;
ctx.Update(viking);
}
ctx.Dragons.Add(dragon);
ctx.Images.Add(image);
@ -904,7 +905,7 @@ public class ContentController : Controller {
[HttpPost]
[Produces("application/xml")]
[Route("ContentWebService.asmx/SetImage")]
[VikingSession(UseLock = true)]
[VikingSession]
public bool SetImage(Viking viking, [FromForm] string ImageType, [FromForm] int ImageSlot, [FromForm] string contentXML, [FromForm] string imageFile) {
// TODO: the other properties of contentXML
ImageData data = XmlUtil.DeserializeXml<ImageData>(contentXML);
@ -924,8 +925,11 @@ public class ContentController : Controller {
image.ImageData = imageFile;
image.TemplateName = data.TemplateName;
if (newImage)
if (newImage) {
ctx.Images.Add(image);
} else {
ctx.Images.Update(image);
}
ctx.SaveChanges();
return true;

View File

@ -74,7 +74,7 @@
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Information"
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"

View File

@ -11,26 +11,26 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="7.0.20" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="9.0.6" />
</ItemGroup>
<Choose>
<When Condition="$(DefineConstants.Contains('USE_SQLITE'))">
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.20" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.6" />
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(DefineConstants.Contains('USE_POSTGRESQL'))">
<ItemGroup>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.18" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="$(DefineConstants.Contains('USE_MYSQL'))">
<ItemGroup>
<PackageReference Include="MySql.EntityFrameworkCore" Version="7.0.16" />
<PackageReference Include="MySql.EntityFrameworkCore" Version="9.0.3" />
</ItemGroup>
</When>
</Choose>