Search code examples
androidsynchronization

Dotmim.Sync null reference exception in web proxy post method


I am using Dotmim.sync framework. I am trying to sync an mssql database with my xamarin android app's sqlite database. So I implemented the web proxy to reach the database from the android app. The proxy starts fine, but then when I call the sync from the android app the Post method gives a null reference error, but I cannot find what is null. enter image description here

enter image description here

In the ASP.NET Core web app's Startup file:

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);
        }

The SyncController:

[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);
    }

In the android app the sync function that is called:

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();
            }
        }

Let me know what further information should I supply to solve this.

EDIT: Calling from postman it gives this error: {"tn":"HttpHeaderMissingExceptiopn","m":"Header dotmim-sync-scope-name is missing."}

EDIT2: Server orchestrator on the client side: enter image description here

On the server side: enter image description here

The details of the exception: enter image description here


Solution

  • SOLUTION:

    I tried the sync with a different database and tables, and that worked, so it was clear that dotmim has some problem with the tables I was using. So after lot of thinking I tried with a different schema name instead of dbo, since the other database that worked had something else. And it turns out the sync has some problem if the schema name is dbo, something gets mixed probably when it tries to create its own new tables. So use something different from dbo for schema.