Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin表单:存档Android应用程序后,当从Xamarin表单发布时,API始终接收空数据_Xamarin_Xamarin.forms_Xamarin.android - Fatal编程技术网

Xamarin表单:存档Android应用程序后,当从Xamarin表单发布时,API始终接收空数据

Xamarin表单:存档Android应用程序后,当从Xamarin表单发布时,API始终接收空数据,xamarin,xamarin.forms,xamarin.android,Xamarin,Xamarin.forms,Xamarin.android,Xamarin表单中的Post方法如下所示 public async Task VerifyMobile(OtpDto otpDto) { _httpClient.BaseAddress = new Uri("https://***.azurewebsites.net"); var jsonData = JsonConvert.SerializeObject(otpDto); var content = new StringContent(jsonData, Enco

Xamarin表单中的Post方法如下所示

public async Task VerifyMobile(OtpDto otpDto)
{
    _httpClient.BaseAddress = new Uri("https://***.azurewebsites.net");

    var jsonData = JsonConvert.SerializeObject(otpDto);

    var content = new StringContent(jsonData, Encoding.UTF8, "application/json");

    HttpResponseMessage response = await _httpClient.PostAsync("api/Auth/VerifyMobile", content);
}
public class OtpDto
{
    public int Id { get; set; }
    public string PhoneNumber { get; set; }
    public int? OneTimePassword { get; set; }
    public DateTime? OtpGeneratedDateTime { get; set; }
    public string AppHashKey { get; set; }
}
Hosting environment: Production
Content root path: D:\home\site\wwwroot
Application started. Press Ctrl+C to shut down.
fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
      Failed executing DbCommand (17ms) [Parameters=[@p0='?' (DbType = Int32), @p1='?' (DbType = DateTime), @p2='?' (Size = 50) (DbType = AnsiString)], CommandType='Text', CommandTimeout='30']
      SET NOCOUNT ON;
      INSERT INTO [Otp] ([OneTimePassword], [OtpGeneratedDateTime], [PhoneNumber])
      VALUES (@p0, @p1, @p2);
      SELECT [Id]
      FROM [Otp]
      WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity();
System.Data.SqlClient.SqlException (0x80131904): Cannot insert the value NULL into column 'PhoneNumber', table 'UDMeShop.dbo.Otp'; column does not allow nulls. INSERT fails.
The statement has been terminated.
而API方法类似于,

[HttpPost]
[Route("VerifyMobile")]
public async Task<IActionResult> VerifyMobile([FromBody]OtpDto otpDto)
{
    ...
}
问题是,当从本地发布数据时,API正在接收数据,但当我尝试将Android应用程序存档(转换为.apk文件)时,API中接收到空值

注意:在API中接收Null,我从日志中了解到,日志消息如下所示

public async Task VerifyMobile(OtpDto otpDto)
{
    _httpClient.BaseAddress = new Uri("https://***.azurewebsites.net");

    var jsonData = JsonConvert.SerializeObject(otpDto);

    var content = new StringContent(jsonData, Encoding.UTF8, "application/json");

    HttpResponseMessage response = await _httpClient.PostAsync("api/Auth/VerifyMobile", content);
}
public class OtpDto
{
    public int Id { get; set; }
    public string PhoneNumber { get; set; }
    public int? OneTimePassword { get; set; }
    public DateTime? OtpGeneratedDateTime { get; set; }
    public string AppHashKey { get; set; }
}
Hosting environment: Production
Content root path: D:\home\site\wwwroot
Application started. Press Ctrl+C to shut down.
fail: Microsoft.EntityFrameworkCore.Database.Command[20102]
      Failed executing DbCommand (17ms) [Parameters=[@p0='?' (DbType = Int32), @p1='?' (DbType = DateTime), @p2='?' (Size = 50) (DbType = AnsiString)], CommandType='Text', CommandTimeout='30']
      SET NOCOUNT ON;
      INSERT INTO [Otp] ([OneTimePassword], [OtpGeneratedDateTime], [PhoneNumber])
      VALUES (@p0, @p1, @p2);
      SELECT [Id]
      FROM [Otp]
      WHERE @@ROWCOUNT = 1 AND [Id] = scope_identity();
System.Data.SqlClient.SqlException (0x80131904): Cannot insert the value NULL into column 'PhoneNumber', table 'UDMeShop.dbo.Otp'; column does not allow nulls. INSERT fails.
The statement has been terminated.

在存档Android应用程序时,我是否需要做一些额外的工作?还是我遗漏了什么?

问题是您试图在SQL server中不可为空的列中插入空值。我们可以做一些事情来防止这种情况。首先是进行模型验证。因此,您可以添加如下属性:

[Required]
public string PhoneNumber { get; set; }
在控制器中,您可以通过执行以下操作来测试模型是否有效:

if (!ModelState.IsValid)
{
   // Handle invalid model here.
}
关于您对请求的关注,这种情况通常不会是因为作为APK或通过VisualStudio运行它之间的差异。但是,您可以考虑在项目选项下不启用链接的情况下建立APK。这将排除链接器是一个问题。请参阅:。另一个问题是,如果在发布版本中配置了不同的URL,我不认为在您的情况下会出现这种情况。我的最后一个技巧是比较接收和发送的实际数据,仔细查看请求/响应。我敢打赌,这将为您提供解决此问题所需的信息。您可以使用名为post man的工具或其他方法来运行各种测试确保调试和检查进出的模型的外观。


希望这能有所帮助。

在没有链接的情况下构建APK对我很有用。非常感谢。向上投票!