为啥我不能从我的 Xamarin Froms 应用程序发布到我的 .net 核心 web api

Posted

技术标签:

【中文标题】为啥我不能从我的 Xamarin Froms 应用程序发布到我的 .net 核心 web api【英文标题】:Why can't I post from my Xamarin Frorms app to my .net core web api为什么我不能从我的 Xamarin Froms 应用程序发布到我的 .net 核心 web api 【发布时间】:2020-09-20 09:37:01 【问题描述】:

我有一个将 json 发送到我的 api 的 post 方法。

我的端点在邮递员中工作,所以我的问题出在我的 xamarin 发布请求中:

    async void RegisterUser(object sender, System.EventArgs e)
    
        string URL = "http://blablahblah:51001/register";

        HttpClient client = new HttpClient();

        var model = new RegisterViewModel
        
            Email = EntryEmail.Text,
            FirstName = FirstName.Text,
            LastName = LastName.Text, 
            Password = EntryPasswrd.Text 

        ;

        var content = JsonConvert.SerializeObject(model);

        await client.PostAsync(URL, new StringContent(content));

    

在它命中等待之后 client.PostAsync(URL, new StringContent(content));行,应用程序就停止了。没有错误消息或类似的东西。

有什么想法吗?

编辑:

我的 API 解决方案中的注册方法:

    [Route("register")]
    [HttpPost]
    public async Task<ActionResult> InsertUser([FromBody] RegisterViewModel model)
    
        var user = new IdentityUser
        
            Email = model.Email,
            UserName = model.Email,
            SecurityStamp = Guid.NewGuid().ToString()
        ;

        var result = await _userManager.CreateAsync(user, model.Password);
        if (result.Succeeded)
        
            var newUser = new User
            
                Username = model.Email,
                FirstName = model.FirstName,
                LastName = model.LastName
            ;

            _dbContext.Users.Add(newUser);
            await _dbContext.SaveChangesAsync();

        
        return Ok(new  Username = user.UserName );
    

我的视图模型正在传递数据:

public class RegisterViewModel

    [Required]
    [EmailAddress]
    public string Email  get; set; 

    [Required]
    public string FirstName  get; set; 

    [Required]
    public string LastName  get; set; 

    [Required]
    public string Password  get; set; 

我已经使用以下建议重写了我的 post 方法,它仍然没有在我的 catch 块中返回任何错误:

    public async Task<string> Registered(object details)
    
        string URL = "http://blahblah:51001/register";

        HttpClient client = new HttpClient();

        var model = new RegisterViewModel
        
            Email = EntryEmail.Text,
            FirstName = FirstName.Text,
            LastName = LastName.Text,
            Password = EntryPasswrd.Text

        ;

        var content = JsonConvert.SerializeObject(model);

        try
        
            await client.PostAsync(URL, new StringContent(content));
        
        catch (Exception ex)
        

            throw new Exception(ex.Message);
        


        return "Registration Successful";
    

【问题讨论】:

您确定没有连接问题吗?您可以从设备的浏览器访问您的 API 网址吗?你确定没有例外或超时吗?使用 async void 通常是一个坏主意 - 有很多帖子和讨论关于为什么会这样以及您应该查看的替代方法。 能否请您在client.PostAsync周围添加一个try-catch块,看看是否有任何异常? 请分享minimal reproducible example。 大家好,我已经对我的方法进行了更改,请检查我上面的编辑,感谢您的贡献! @Jason 我在 android 模拟器浏览器中运行了 url,但它似乎不起作用?它说不好的请求? 【参考方案1】:

请先使用 POSTMAN 等 REST 测试工具测试 Web Api,以验证它是否适用于您的 JSON 数据。

如果你的webapi没有问题,请看下面的代码,我可以成功post数据到asp.net core webapi,并返回值。

 private async void btnpost_Clicked(object sender, EventArgs e)
    
        ContactModel cm = new ContactModel() ID=1,Name="cherry",Age=12 ;

        var httpClient = new HttpClient();
        var content = JsonConvert.SerializeObject(cm);
        HttpContent httpContent = new StringContent(content, Encoding.UTF8);
        httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
        var uri = new Uri("http://xxx.xx.xx.xx:8088/api/Contact");
        HttpResponseMessage response = await httpClient.PostAsync(uri, httpContent);
        if (response.IsSuccessStatusCode)
        
            var data = await response.Content.ReadAsStringAsync();

            string ss = data;
        

    

请注意:在 Mainfeast.xml 中添加 android:usesCleartextTraffic="true",因为从 Android 9(API 级别 28)开始,明文支持默认禁用。如果不是,您可能会遇到 Cleartext HTTP traffic not allowed 错误。

【讨论】:

感谢您,虽然这并没有解决整个问题,但我已将您的一些方法纳入我的帖子请求中。【参考方案2】:

所以经过 2 天的谷歌搜索后,我找到了解决方案:

https://marketplace.visualstudio.com/items?itemName=vs-publisher-1448185.ConveyorbyKeyoti#overview

现在我可以从我的 xamarin 表单项目发布到我的 api !!!

感谢大家的意见

【讨论】:

@很高兴听到您自己解决了您的问题,请记得将您的回复标记为答案,有利于其他人找到此答案,谢谢。 抱歉!我刚刚标记了它。感谢您在这方面的帮助!

以上是关于为啥我不能从我的 Xamarin Froms 应用程序发布到我的 .net 核心 web api的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能从我的 java 程序运行批处理命令? [复制]

为啥我的 Xamarin.Android 项目不能在启用 Proguard 的情况下构建:“java.exe”退出代码 1

为啥我不能从我的查询中选择?

为啥我不能从我的 UICollectionView 中删除图像?

如果我可以从我的私人 IP 地址访问本地文件,为啥我不能从我的公共 IP 地址访问本地文件?

为啥我不能从我的 python 脚本创建可执行文件?