2016-08-09 73 views
1

Ich habe mir die Haare gezogen, um es zur Arbeit zu bringen. Das ist, was ich versuche zu erreichen:Fehler beim Erstellen des Lucene-Indexes im Azure-Blob mit Azuredirectory

Funktionalität
  1. Verwenden lucene.Net Such diese
  2. Gastgeber auf azur

Das Problem:

ich dieses Tutorial verwendet Lucene.Net ultra fast search for MVC or WebForms site => made easy! zu Es begann und es funktionierte perfekt beim Abrufen von meinem localdb, um Indexdateien auf meinem lokalen Datenträger zu erstellen und anschließend Restmethoden aufzurufen, um die Suche durchzuführen.

Jetzt versuche ich einen Teil des Codes zu konvertieren, um stattdessen den Blob zu referenzieren. so ist das Original dieses:

private static string _luceneDir =Path.Combine(HttpContext.Current.Request.PhysicalApplicationPath, "lucene_index"); 
private static FSDirectory _directoryTemp; 
private static FSDirectory _directory { 
get { 
    if (_directoryTemp == null) _directoryTemp = FSDirectory.Open(new DirectoryInfo(_luceneDir)); 
    if (IndexWriter.IsLocked(_directoryTemp)) IndexWriter.Unlock(_directoryTemp); 
    var lockFilePath = Path.Combine(_luceneDir, "write.lock"); 
    if (File.Exists(lockFilePath)) File.Delete(lockFilePath); 
    return _directoryTemp; 
}} 

Habe ich es, dies zu:

private static AzureDirectory azureDirectory = new AzureDirectory(CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")),"SearchCatalog"); 
private static AzureDirectory _directoryTemp; 


     private static AzureDirectory _directory 
     { 
      get 
      { 
       // if (_directoryTemp == null) _directoryTemp = FSDirectory.Open(new DirectoryInfo(_luceneDir)); 
       if (_directoryTemp == null) _directoryTemp = azureDirectory; 
       if (IndexWriter.IsLocked(_directoryTemp)) IndexWriter.Unlock(_directoryTemp); 
       return _directoryTemp; 
      } 
     } 

ich die letzten 2 Zeilen wegnahm, da ich keine Ahnung, wie hatte in azur die Filepath eines blobl Lagerung zu erhalten und von meinem Verständnis her ist es nicht möglich.

Was passiert jetzt ist der Container im Blob wird erstellt, aber die Indexdateien werden nicht erstellt und ich bekomme einen http 404 Fehler. Detaillierte Fehler:

{ 
    "Message": "An error has occurred.", 
    "ExceptionMessage": "The remote server returned an error: (404) Not Found.", 
    "ExceptionType": "Microsoft.WindowsAzure.Storage.StorageException", 
    "StackTrace": " at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext)\r\n at Microsoft.WindowsAzure.Storage.Blob.CloudBlobClient.GetBlobReferenceFromServer(StorageUri blobUri, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext)\r\n at Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer.GetBlobReferenceFromServer(String blobName, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext)\r\n at Lucene.Net.Store.Azure.AzureLock.IsLocked()\r\n at Lucene.Net.Index.IndexWriter.IsLocked(Directory directory)\r\n at brickandmortarv1.Models.LuceneSearch.get__directory()\r\n at brickandmortarv1.Models.LuceneSearch.AddUpdateLuceneIndex(IEnumerable`1 products)\r\n at brickandmortarv1.Controllers.LuceneController.Get(String searchterm)\r\n at lambda_method(Closure , Object , Object[])\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()", 
    "InnerException": { 
    "Message": "An error has occurred.", 
    "ExceptionMessage": "The remote server returned an error: (404) Not Found.", 
    "ExceptionType": "System.Net.WebException", 
    "StackTrace": " at System.Net.HttpWebRequest.GetResponse()\r\n at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext)" 
    } 
} 

Vielen Dank im Voraus, verloren wirklich ganz was im falsch zu machen.

Antwort

0

Bitte entfernen Sie den folgenden Code

 if (IndexWriter.IsLocked(_directoryTemp)) IndexWriter.Unlock(_directoryTemp); 

Nach oben Code entfernen, funktioniert es. Hier ist der Screenshot, der auf meiner Seite funktioniert:

enter image description here

Das folgende ist mein Code:

private static AzureDirectory azureDirectory = new AzureDirectory(CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=jastorage1;AccountKey=***"),"sample" 

     private static AzureDirectory _directoryTemp; 
     private static AzureDirectory _directory 
     { 
      get 
      { 
       // if (_directoryTemp == null) _directoryTemp = FSDirectory.Open(new DirectoryInfo(_luceneDir)); 
       if (_directoryTemp == null) _directoryTemp = azureDirectory; 
       // if (IndexWriter.IsLocked(_directoryTemp)) IndexWriter.Unlock(_directoryTemp); 
       _directoryTemp.ClearLock("write.lock"); 
       return _directoryTemp; 
      } 
     } 
+0

Entschuldigung, ich habe diese Woche beschäftigt. Ich werde das heute Abend versuchen und die Antwort markieren, wenn es funktioniert. –