1

我正在考虑为 RavenDB 编写一个导入/导出例程,以便我可以在本地的完整服务器实例上进行开发,但由于资源限制可以嵌入在网站上运行。我希望能够在网站的锁定部分管理功能,以允许从文件进行备份和恢复。但我也希望能够将生产数据集恢复到本地服务器实例中,以用于调试和开发目的。

作为其中的一部分,我一直在研究使用 v2.5.2750 的 ISmugglerApi 接口,特别是 Raven.Database.Smuggler.DataDumper 和 Raven.Smuggler.SmugglerApi 实现。

我可以使用嵌入式实例进行备份和恢复。我可以很好地备份服务器实例并将此文件导入嵌入式实例。但是,还原到服务器数据库是出现问题的地方。

我正在使用的代码如下:

恢复代码:

        SmugglerOptions smugglerOptions = new SmugglerOptions { BackupPath = Server.MapPath(ServerMapPath) };
        switch (Context)
        {
            case Context.Embedded:
                DataDumper dumper = new DataDumper(((EmbeddableDocumentStore)MvcApplication.Store).DocumentDatabase, smugglerOptions);
                var embeddedImport = dumper.ImportData(smugglerOptions);
                await embeddedImport;
                break;

            case Context.Server:
                var connectionStringOptions = new RavenConnectionStringOptions
                {
                    ApiKey = Configuration.ApiKey,
                    DefaultDatabase = Configuration.DefaultDatabase,
                    Url = Configuration.DefaultUrl
                };

                var smugglerApi = new SmugglerApi(smugglerOptions, connectionStringOptions);
                var serverImport = smugglerApi.ImportData(smugglerOptions);
                await serverImport;
                break;
        }

备份代码:

        SmugglerOptions smugglerOptions = new SmugglerOptions { BackupPath = Server.MapPath(ServerMapPath) };
        switch (Context)
        {
            case Context.Embedded:
                DataDumper dumper = new DataDumper(((EmbeddableDocumentStore)MvcApplication.Store).DocumentDatabase, smugglerOptions);
                var embeddedExport = dumper.ExportData(null, smugglerOptions, false);
                await embeddedExport;
                break;

            case Context.Server:
                var connectionStringOptions = new RavenConnectionStringOptions
                {
                    ApiKey = Configuration.ApiKey,
                    DefaultDatabase = Configuration.DefaultDatabase,
                    Url = Configuration.DefaultUrl
                };

                var smugglerApi = new SmugglerApi(smugglerOptions, connectionStringOptions);
                var serverExport = smugglerApi.ExportData(null, smugglerOptions, false);
                await serverExport;
                break;
        }

ServerMapPath 当前是 App_Data 文件夹中文件名称的 const 字符串。

Configuration.* 是一个简单的静态类,用于从 web.config 中读取所需设置的值。

上下文是一个配置选项,用于指定运行环境的类型。

当我在服务器数据库配置中运行恢复时,我得到以下信息:

远程服务器返回错误:(400) 错误请求。

[WebException:远程服务器返回错误:(400) 错误请求。] System.Net.HttpWebRequest.GetResponse() +6592536
Raven.Client.Connection.HttpJsonRequest.ReadJsonInternal(Func`1 getResponse) in c:\Builds\RavenDB -Stable\Raven.Client.Lightweight\Connection\HttpJsonRequest.cs:349

[无效操作异常:

不知道该怎么做

您的请求与 Raven 知道的任何事情都不匹配,抱歉...

]
Raven.Client.Connection.HttpJsonRequest.HandleErrors(WebException e) 在 c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Connection\HttpJsonRequest.cs:513 Raven.Client.Connection.HttpJsonRequest.ReadJsonInternal(Func`1 getResponse) 在 c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Connection\HttpJsonRequest.cs:355 Raven.Client.Connection.HttpJsonRequest.ReadResponseJson() 在 c:\Builds\RavenDB-Stable\Raven.Client 中。 Lightweight\Connection\HttpJsonRequest.cs:239 Raven.Client.Document.RemoteBulkInsertOperation.GetAuthToken() 在 c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Document\RemoteBulkInsertOperation.cs:151 Raven.Client.Document.d_b.MoveNext() 在 c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Document\RemoteBulkInsertOperation.cs:0 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+93
System.Runtime.CompilerServices.TaskAwaiter .HandleNonSuccessAndDebuggerNotification(Task task) +52
Raven.Client.Document.d
_3.MoveNext() in c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\Document\RemoteBulkInsertOperation.cs:100 System.Runtime.CompilerServices.TaskAwaiter .ThrowForNonSuccess(任务任务)+93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+52 Raven.Client.Document.d__18.MoveNext() 在 c:\Builds\RavenDB-Stable\Raven.Client.Lightweight\文档\RemoteBulkInsertOperation.cs:281

[AggregateException: 发生一个或多个错误。]
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +83
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccess(Task task) +71 Raven.Smuggler.d_ 6.MoveNext()在 c:\Builds\RavenDB-Stable\Raven.Smuggler\SmugglerApi.cs:87
System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+52 Raven .Abstractions.Smuggler.d
_26.MoveNext() in c:\Builds\RavenDB-Stable\Raven.Abstractions\Smuggler\SmugglerApiBase.cs:322 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +52 System.Runtime.CompilerServices.TaskAwaiter.GetResult() +21 SampleApplication.Controllers.d__15.MoveNext() in c:\Src\Random\RavenImportExport\SampleApplication\Controllers \HomeController.cs:105 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)+93
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)+52 lambda_method(闭包,任务)+23
System.Threading.Tasks。 TaskHelpersExtensions.ThrowIfFaulted(任务任务)+33 System.Web.Mvc.Async.TaskAsyncActionDescriptor.EndExecute(IAsyncResult asyncResult)+68
System.Web.Mvc.Async.<>c_ DisplayClass34.b _33(IAsyncResult asyncResult)+16
System.Web.Mvc.Async.WrappedAsyncResult 1.End() +49 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32 System.Web.Mvc.Async.AsyncInvocationWithFilters.b_3c () +50 系统.Web.Mvc.Async.<>c _DisplayClass45.b_3e () +225 System.Web.Mvc.Async.<>c _DisplayClass30.b_2f (IAsyncResult asyncResult) +10 System.Web.Mvc.Async.WrappedAsyncResult 1。 End() +49 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34 System.Web.Mvc.Async.<>c _DisplayClass28.b_ 19() +26 System.Web.Mvc.Async.< >c _DisplayClass1e.b_1.CallEndDelegate(IAsyncResult asyncResult) +10
System.Web.Mvc.Async.WrappedAsyncResultBase



1.CallEndDelegate(IAsyncResult asyncResult) +10
System.Web.Mvc.Async.WrappedAsyncResultBase


1b(IAsyncResult asyncResult) +100
System.Web.Mvc.Async.WrappedAsyncResult 1.End() +49 System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27 System.Web.Mvc.Controller.b1.CallEndDelegate(IAsyncResult asyncResult) +10
System.Web.Mvc.Async.WrappedAsyncResultBase


_1d (IAsyncResult asyncResult, ExecuteCoreState innerState) +13
System.Web.Mvc.Async.WrappedAsyncVoid 1.End() +54 System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +39 System.Web.Mvc.Controller.b_ 15 (IAsyncResult asyncResult,控制器控制器)+12 System.Web.Mvc.Async.WrappedAsyncVoid 1.End() +54 System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +291.CallEndDelegate(IAsyncResult asyncResult) +36
System.Web.Mvc.Async.WrappedAsyncResultBase


1.CallEndDelegate(IAsyncResult asyncResult) +28
System.Web.Mvc.Async.WrappedAsyncResultBase


System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
System.Web.Mvc.MvcHandler.b
_4(IAsyncResult asyncResult, ProcessRequestState innerState) +21
System.Web.Mvc。 Async.WrappedAsyncVoid 1.End() +54 System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +31 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult 结果) +9 System.Web. CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar) +1291.CallEndDelegate(IAsyncResult asyncResult) +36
System.Web.Mvc.Async.WrappedAsyncResultBase


我究竟做错了什么?

4

0 回答 0