Sense/net 在 Web 应用程序中使用内容查询

Sense/net using content query in web application

我尝试在 Web 应用程序中使用内容查询,但它引发异常“Lucene.Net.Store.AlreadyClosedException:此 IndexReader 已关闭”。请帮我解决这个问题。

var startSettings = new RepositoryStartSettings
        {
            Console = Console.Out,
            StartLuceneManager = true, // <-- this is necessary
            IsWebContext = false,
            PluginsPath = AppDomain.CurrentDomain.BaseDirectory,
        };

        using (Repository.Start(startSettings))
        {
            var resultQuery = ContentQuery.Query("+InTree:@0 + DisplayName:*@1*", null, folderPath, q);

        }

从不同的应用程序(应用程序域)连接到 Sense/Net 的推荐方法是通过 REST API。它更容易维护并且涉及更少的配置(唯一的例外是您在 Sense/Net 应用程序本身内部工作,或者您只有一个应用程序并且您不想从任何地方访问 Sense/Net否则,您愿意处理 Sense/Net 的本地索引及其所需的所有配置值等)。

通过 REST 连接 API 并不意味着您必须手动发送 HTTP 请求(尽管这一点也不复杂):有一个 .Net 客户端库 为你做的。您可以通过客户端访问所有内容元数据或二进制文件,可以上传文件、查询内容、管理权限等

// loading a content
dynamic content = await Content.LoadAsync(id);
DateTime date = content.BirthDate;

// querying
var results = await Content.QueryAsync(queryText);

要在 Web 应用程序中使用它,您必须执行以下操作:

  • 在应用程序生命周期开始时(例如应用程序启动)初始化客户端上下文一次
  • 如果您需要以当前登录用户的名义向 Sense/Net 发出请求(例如,因为您想要查询她可以访问的文档),那么您必须创建一个新的 ServerContext 为每个用户提供 username/password 对象,并将此对象提供给任何客户端调用(例如加载或保存内容方法)。
var sc = new ServerContext 
{ 
    Url = "http://example.com", 
    Username = "user1", 
    Password = "asdf" 
};

var content = await Content.LoadAsync(id, sc);