C# 在web服务中验证Solr连接
我正在开发一个web服务,它应该获取一些数据,使用它们进行查询,在Solr中搜索并返回适当的结果!它工作正常,但我只需要它初始化Solr一次到目前为止,我得到了以下结果:C# 在web服务中验证Solr连接,c#,web-services,solr,solrnet,C#,Web Services,Solr,Solrnet,我正在开发一个web服务,它应该获取一些数据,使用它们进行查询,在Solr中搜索并返回适当的结果!它工作正常,但我只需要它初始化Solr一次到目前为止,我得到了以下结果: private static bool initialized = false; [WebMethod] public XmlDocument getContributor(string name,string email) { if (!initialized) {
private static bool initialized = false;
[WebMethod]
public XmlDocument getContributor(string name,string email)
{
if (!initialized)
{
Startup.Init<SolrSearchResult>("http://Host:44416/solr");
initialized = true;
}
if (string.IsNullOrEmpty(email))
{
return SolrSearchResult.SearchData(name);
}
return SolrSearchResult.SearchDataWithEmail(name, email);
}
private static bool initialized=false;
[网络方法]
公共XmlDocument getContributor(字符串名称、字符串电子邮件)
{
如果(!已初始化)
{
Startup.Init(“http://Host:44416/solr");
初始化=真;
}
if(string.IsNullOrEmpty(电子邮件))
{
返回SolrSearchResult.SearchData(名称);
}
返回SolrSearchResult.SearchDataWithEmail(名称、电子邮件);
}
但我认为当多个用户使用时,它将不起作用!我需要一个更聪明的方法来解决这个问题!如果有任何建议,我将不胜感激
我看过SampleSolrApp,应用程序_Start中使用了startup.init,但我不知道这里的等效方法是什么。一种确保
startup.init
不会被多次调用的方法是引入互斥锁来同步对那段代码
在您的情况下,我将首先引入一个要锁定的静态对象:
private static readonly object syncRoot = new object();
然后将代码的该部分包含在lock语句中:
lock (syncRoot)
{
// only 1 thread ever enters here at any time.
if (!initialized)
{
Startup.Init<SolrSearchResult>("http://Host:44416/solr");
initialized = true;
// no more threads can ever enter here.
}
}
当
initialized
不需要变为false
并且您不需要Startup.Init
在以后的阶段再次运行时,无论出于何种原因,都可以使用此功能。否则,使用这个代码可能会遇到问题。如果您的问题是并发性的,则应该考虑将调用同步到代码> init < /C>。很抱歉,你可以用一个简单的锁@bizzies来实现这一点,但是你能再演示一下吗!我对这个有点陌生!谢谢你的帮助!
// check to see if its worth locking in the first place.
if (!initialized)
{
lock (syncRoot)
{
// only 1 thread ever enters here at any time.
if (!initialized)
{
Startup.Init<SolrSearchResult>("http://Host:44416/solr");
initialized = true;
// no more threads can ever enter here.
}
}
}