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

时间:2016-11-28 10:26:26

标签: sensenet

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

        }

1 个答案:

答案 0 :(得分: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);