【问题标题】:StatusCode 400 "Bad request" when Connecting a Xamarin.forms app on a physical Phone to an Asp.net REST API将物理电话上的 Xamarin.forms 应用程序连接到 Asp.net REST API 时出现 StatusCode 400“错误请求”
【发布时间】:2020-09-03 05:00:46
【问题描述】:

感谢您的关注。 我正在尝试制作一个与REST API 通信的Xamarin.Forms 应用程序。 该 API 功能齐全,我已经使用 Postman 和另一个 WPF 项目对其进行了测试。 在尝试使用我的HttpClient 调用简单的GET 方法时,我得到以下HttpResponseMessage

{
    StatusCode: 400, 
    ReasonPhrase: 'Bad Request', 
    Version: 1.1, 
    Content: System.Net.Http.StreamContent, 
    Headers:
    {
        Server: Microsoft-HTTPAPI/2.0
        Date: Sun, 17 May 2020 12:20:37 GMT
        Connection: close
        Content-Type: text/html; charset=us-ascii
        Content-Length: 334
    }
}

public async Task TurnLEDOn()
{
    HttpClient Client = new HttpClient(new System.Net.Http.HttpClientHandler());

    Client.DefaultRequestHeaders.Accept.Clear();
    Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/Json"));
    Client.BaseAddress = new Uri("https://192.168.1.2:44341/");
    HttpResponseMessage response = await Client.GetAsync("api/ChipCore/TurnLEDOn");
    if (response.IsSuccessStatusCode)
    {
        string receivedPerson = await response.Content.ReadAsAsync<string>();
    }
}

同样的代码由 WPF 程序运行并且可以完美运行。

我的手机和笔记本电脑都连接到同一个 Wi-Fi 网络。

  • 我已经允许端口44341 通过防火墙,我什至尝试过运行 防火墙关闭的整个事情。手机浏览器打不开 访问 API。 (错误请求)
  • 我尝试将服务器 url 从 https 更改为 http 但面临 trust anchor for certification path not found 我已将这些权限添加到android.manifest
CHANGE_NETWORK_STATE
CHANGE_WIFI_STATE
ACCESS_NETWORK_STATE
INTERNET

API 中的方法

[RoutePrefix("api/ChipCore")]
public class ValuesController : ApiController
{
    [HttpGet]
    [Route("TurnLEDOn")]
    public bool TurnLEDOn()
    {
        return Switch.TurnLEDOn();
    }
}

更新

  • 我尝试通过将此行添加到 MainActivity.cs 来绕过证书

    ServicePointManager.ServerCertificateValidationCallback += (o, cert, chain, errors) => true;

  • 我已经厌倦了在手机浏览器中输入网址,我得到Error 400 - Bad Request

【问题讨论】:

  • 如果你只是通过手机浏览https://192.168.1.2:44341/api/ChipCore/TurnLEDOn会发生什么?
  • 您可以使用此链接中描述的方法绕过证书错误。我相信您需要正确配置 https 以使其与 https 一起使用:forums.xamarin.com/discussion/91782/… 检查以下链接以了解如何在 .Net Core 上配置 https:docs.microsoft.com/en-us/aspnet/core/security/authentication/…
  • 你能回答@FrankNielsen 提出的问题吗?
  • “我已经厌倦了在手机浏览器中输入 URL,我收到错误 400 - 错误请求”是问题本身@TarunLalwani
  • 这个网站是关于编码问题的。您的问题不属于这种类型,而是您的手机无法连接到某个本地服务器。这个问题应该被关闭,但它有一个赏金所以它似乎不可能。

标签: c# api rest xamarin.forms


【解决方案1】:

IIS Express 无法处理来自其他机器的请求。

你可以:

【讨论】:

  • 一定会尝试
  • 很抱歉迟到的回复有很多事情要做,扩展工作完美。成为下一个邮递员的路途。
【解决方案2】:

尝试以下解决方案。

  1. 右键单击Android项目->Android选项->高级->将HttpClientimplementation从Default更改为Android

参考:Xamarin Forms - simple PostAsync() returns error 400 bad request

.

  1. 如果此解决方案不起作用,您可以尝试执行仅在满足HttpResponseMessage.IsSuccessStatusCode 时出现错误的代码。
if (Resultado.IsSuccessStatusCode)
{
    //
}

参考:https://forums.xamarin.com/discussion/comment/391413/#Comment_391413

.

  1. 如果两个解决方案都不起作用,您可以尝试转到this similar question for more answers

【讨论】:

  • 1) 我检查了在我的 android 项目上设置的选项,HttpClient 实现已经设置为 Android。 2)我已经这样做了,它甚至出现在我提出的问题的代码中。 3)您提供的链接是对问题略有不同的人的参考。他们能够在他们的场景中建立连接。但当“外键”被添加到他们的模型类之一时,则不然。不过,感谢您投入的时间。
【解决方案3】:

您的手机似乎没有连接到您的服务器(托管在您的计算机上)。

如果您能够使用 Postman 访问相同的请求,那应该不是问题,但让我们找出答案。

第 1 步)您的服务器日志说什么?当您的手机抛出 400 bad request 错误时,它是否真的连接到您的计算机?只需转到您的服务器日志,看看它是否被击中?如果服务器被击中,则转到第 2 步。否则转到第 3 步进行进一步确认。

第 2 步)您能否将通过邮递员发出的请求与通过手机发出的请求进行比较?标题和正文?还是使用 WPF 请求?你需要找出有什么不同,因为肯定有什么不同。

第 3 步)你能再尝试一件事吗?只需在根“/”创建一个新控制器并发送一个“Hello world”字符串作为响应。现在尝试通过您的手机和邮递员访问根目录。您可以直接在手机浏览器中打开它。如果它没有说“Hello world”,则确认您的 api 没有任何问题,但您的手机和计算机存在连接问题。

【讨论】:

    【解决方案4】:

    假设您在调试模式下运行 IIS Express,它不会允许来自您计算机外部的任何连接,我之前在 WebAPI 上遇到过同样的问题

    您可能想尝试在虚拟机或其他东西中运行您的应用程序 您还应该尝试从另一台计算机访问 API,您可以使用您准备好的 WPF 应用程序对其进行测试,我相信您会遇到同样的问题

    您也可以尝试使用服务器 IP 地址而不是 localhost

    发送邮递员请求

    如果您碰巧以这种方式重现问题,那么您只需将 IIS 配置为服务器远程/外部流量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多