首页 > 解决方案 > Web 代理发布方法中的 Dotmim.Sync 空引用异常

问题描述

我正在使用 Dotmim.sync 框架。我正在尝试将 mssql 数据库与我的 xamarin android 应用程序的 sqlite 数据库同步。所以我实现了 Web 代理以从 android 应用程序访问数据库。代理启动正常,但是当我从 android 应用程序调用同步时,Post 方法给出了一个空引用错误,但我找不到什么是空的。 在此处输入图像描述

在此处输入图像描述

在 ASP.NET Core Web 应用的启动文件中:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();

            // [Required]: To be able to handle multiple sessions
            services.AddMemoryCache();

            // [Required]: Get a connection string to your server data source
            var connectionString = @"[my connection string]";

            // [Required]: Tables list involved in the sync process
            var tables = new string[] { "dbo.Album", "dbo.Artist", "dbo.Customer", "dbo.Invoice", "dbo.InvoiceItem", "dbo.Track" };

            // [Required]: Add a SqlSyncProvider acting as the server hub.
            services.AddSyncServer<SqlSyncChangeTrackingProvider>(connectionString, tables);
        }

同步控制器:

[ApiController]
    [Route("api/[controller]")]
    public class SyncController : ControllerBase
    {
        private WebServerManager manager;

        public SyncController(WebServerManager man) => this.manager = man; 

        [HttpPost]
        public async Task Post()
        {
            await manager.HandleRequestAsync(this.HttpContext);
        }  //----> the Null error comes 

        [HttpGet]
        public async Task Get() => await manager.HandleRequestAsync(this.HttpContext);
    }

在 android 应用程序中调用的同步功能:

public async Task SyncDatabase(string connString, Context context)
        {
            var handler = HttpClientHandlerService.GetInsecureHandler();

            HttpClient httpClient = new HttpClient(handler);
            httpClient.DefaultRequestHeaders.Host = $"localhost:44372";   

            var serverOrchestrator = new WebClientOrchestrator("https://10.0.2.2:44372/api/sync", client: httpClient);   

            // Second provider is using plain sqlite provider
            var clientProvider = new SqliteSyncProvider(connString);

            var agent = new SyncAgent(clientProvider, serverOrchestrator);

            try
            {
                var result = await agent.SynchronizeAsync();   //---> error comes when this line is called

                var output = result.ToString();
                output = output.Replace("\n", " ").Replace("\t", " ").Replace("\r", " ");
                Toast.MakeText(context, output, ToastLength.Long).Show();
            }
            catch (Exception e)
            {
                Toast.MakeText(context, e.Message, ToastLength.Long).Show();
            }
        }

让我知道我应该提供哪些进一步的信息来解决这个问题。

编辑:从邮递员调用它给出了这个错误: {"tn":"HttpHeaderMissingExceptiopn","m":"Header dotmim-sync-scope-name is missing."}

EDIT2:客户端的服务器编排器: 在此处输入图像描述

在服务器端: 在此处输入图像描述

异常详情: 在此处输入图像描述

标签: androidsynchronization

解决方案


解决方案:

我尝试使用不同的数据库和表进行同步,并且成功了,因此很明显 dotmim 对我使用的表存在一些问题。所以经过深思熟虑后,我尝试使用不同的模式名称而不是 dbo,因为另一个工作的数据库有其他东西。事实证明,如果模式名称是 dbo,则同步存在一些问题,当它尝试创建自己的新表时,可能会出现一些问题。所以使用与 dbo 不同的东西作为模式。


推荐阅读