我正在Azure服務結構中創建一個actor服務。部署到Azure時,它似乎首先起作用。可以添加和返回文本(演員由Web API前端),但在空閒一段時間後,GetTextsAsync將返回一個空集合。爲什麼演員的國家失去了?
編輯: 我已經更新了代碼,以檢查添加它之前狀態是否存在,但它不能解決問題。
[StatePersistence(StatePersistence.Persisted)]
public class TextActor : Actor, ITextActor
{
protected override async Task OnAactivateAsync()
{
if(!await StateManager.ContainsStateAsync("State"))
{
await this.StateManager.TryAddStateAsync<List<string>>("State", new List<string>());
}
}
public async Task AddTextAsync(string text)
{
var texts = await this.StateManager.GetStateAsync<List<string>>("State");
texts.Add(text);
await this.StateManager.SetStateAsync("State", texts);
}
public async Task<List<string>> GetTextsAsync()
{
return await this.StateManager.GetStateAsync<List<string>>("State");
}
}
編輯2: 看起來好像演員本身被替換。我修改了actor以返回其ActorId,並且當文本列表消失時,ActorId也被替換爲新的。
我遵循VoiceMailBox示例中的模式,其中actor是在控制器中靜態創建的。這是問題嗎?
public class TextsController : ApiController
{
private static Uri serviceUri = new Uri("fabric:/TextApp/TextActorService");
private static ActorId actorId = ActorId.CreateRandom();
private static ITextActor textActor = ActorProxy.Create<ITextActor>(actorId, serviceUri);
[HttpGet]
public async Task<IHttpActionResult> GetTexts()
{
var texts = await textActor.GetTextsAsync();
return Ok(texts);
}
//Methods omitted
}
重新編輯2:行'private static ActorId actorId = ActorId.CreateRandom();'似乎是一個壞主意。您的每個WebApi無狀態服務實例都會以不同的'ActorId'結尾。即使只有一個實例,如果要重新啓動,替換實例對於「textActor」將具有不同的「ActorId」。我會去使用一個常量'ActorId',看看是否解決了這個問題。就像'私人靜態ActorId actorId =新的ActorId(0);' –
@NickBarrett,這是我的主要問題。 – Landrew