我使用两个服务构建了一个Service Fabric应用程序:
可以在Service Fabric中创建有状态的Web API服务。我试图摆脱数据服务并仅在Web API服务中管理可靠的字典。但是,我无法访问控制器中的 StateManager 。我无法在网上找到任何这样的样本。
我对有状态的ASP.NET核心API服务的理解是否正确?也就是说,我可以直接在其中使用可靠的集合吗?
答案 0 :(得分:4)
如果需要扩展,还应该考虑分区。 在这种情况下,可能更好的单独服务。
(不是真正的答案,但我不能发表评论,因为我不到50分:))
答案 1 :(得分:3)
是的 - 您可以在asp.net服务中使用可靠的集合。此示例与您正在构建的内容相同:https://github.com/Azure-Samples/service-fabric-dotnet-quickstart它包含一个asp.net核心状态服务。
主要内容:
现在您的控制器可以访问单例StateManager:
public MyDataController(IReliableStateManager stateManager)
{
this.stateManager = stateManager;
}
答案 2 :(得分:1)
如果您希望服务在所有节点上都可用,则允许侦听辅助副本'。
Path directory = Paths.get("P:\Java\Test\backups\test.zip");
// path to the world;
Path world = Paths.get("P:\Java\Test\world");
[...]
// Create a map which tells the file system to create a new file if it doesn't exist
ImmutableMap immutableMap = ImmutableMap.of("create", String.valueOf(Files.notExists(this.directory)));
// Get a file system provider which is capable of creating a ZIP file
FileSystemProvider zipProvider = FileSystemProvider.installedProviders().stream()
.filter(provider -> provider.getScheme().equals("jar")).findFirst().get();
// Create the file system
try (FileSystem fs = zipProvider.newFileSystem(this.directory, immutableMap)) {
try {
Files.walk(this.world).forEach((Path sourcePath) -> {
try {
CopyOption[] option = new CopyOption[] {
StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES
};
Path destination = this.directory.resolve(this.world.relativize(sourcePath));
Files.copy(sourcePath, destination,option);
} catch (IOException e) {
e.printStackTrace();
}
});
} catch (IOException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}