Dotmim.Sync Web 代理 post 方法中的空引用异常
Dotmim.Sync null reference exception in web proxy post method
我正在使用 Dotmim.sync 框架。我正在尝试将 mssql 数据库与我的 xamarin android 应用程序的 sqlite 数据库同步。所以我实现了 Web 代理以从 android 应用访问数据库。
代理启动正常,但是当我从 android 应用程序调用同步时,Post 方法给出空引用错误,但我找不到什么是空的。
在 ASP.NET 核心网络应用程序的启动文件中:
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."}
编辑2:
客户端的服务器编排器:
在服务器端:
异常详情:
解决方案:
我尝试了与不同的数据库和表的同步,并且成功了,所以很明显 dotmim 对我使用的表有一些问题。因此,经过深思熟虑后,我尝试使用不同的架构名称而不是 dbo,因为另一个可用的数据库有其他名称。事实证明,如果架构名称是 dbo,同步就会出现一些问题,当它尝试创建自己的新表时,可能会出现一些问题。所以使用不同于 dbo 的东西作为模式。
我正在使用 Dotmim.sync 框架。我正在尝试将 mssql 数据库与我的 xamarin android 应用程序的 sqlite 数据库同步。所以我实现了 Web 代理以从 android 应用访问数据库。
代理启动正常,但是当我从 android 应用程序调用同步时,Post 方法给出空引用错误,但我找不到什么是空的。
在 ASP.NET 核心网络应用程序的启动文件中:
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."}
编辑2:
客户端的服务器编排器:
在服务器端:
异常详情:
解决方案:
我尝试了与不同的数据库和表的同步,并且成功了,所以很明显 dotmim 对我使用的表有一些问题。因此,经过深思熟虑后,我尝试使用不同的架构名称而不是 dbo,因为另一个可用的数据库有其他名称。事实证明,如果架构名称是 dbo,同步就会出现一些问题,当它尝试创建自己的新表时,可能会出现一些问题。所以使用不同于 dbo 的东西作为模式。