0

我尝试在 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);

        }
4

1 回答 1

0

从不同的应用程序(应用程序域)连接到 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对象该用户,并将此对象提供给任何客户端调用(例如加载或保存内容方法)。
var sc = new ServerContext 
{ 
    Url = "http://example.com", 
    Username = "user1", 
    Password = "asdf" 
};

var content = await Content.LoadAsync(id, sc);
于 2016-12-02T20:37:59.440 回答