Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.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
Android 错误请求400从Flatter请求ASP.Net Core 3.0_Android_Asp.net Core_Flutter - Fatal编程技术网

Android 错误请求400从Flatter请求ASP.Net Core 3.0

Android 错误请求400从Flatter请求ASP.Net Core 3.0,android,asp.net-core,flutter,Android,Asp.net Core,Flutter,我正在尝试连接Flatter的HttpClient,以便从运行在ASP.NETCore3.0上的本地服务器获取数据。问题是每次尝试时都会出现错误400(错误请求) 以下是颤振代码: String token = await SharedPreferencesService.getStringFromSF('idToken'); var client = new HttpClient(); client.badCertificateCallback = (X

我正在尝试连接Flatter的HttpClient,以便从运行在ASP.NETCore3.0上的本地服务器获取数据。问题是每次尝试时都会出现错误400(错误请求)

以下是颤振代码:

    String token = await SharedPreferencesService.getStringFromSF('idToken');
    var client = new HttpClient();
    client.badCertificateCallback =
        (X509Certificate cert, String host, int port) => true;

    HttpClientRequest request =
        await client.getUrl(Uri.parse('https://10.0.2.2:44383/weatherforcast'));
    request.headers.add('idToken', token);

    HttpClientResponse response = await request.close();
    String reply = await response.transform(utf8.decoder).join();
asp.net core 3.0终结点:

    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        [HttpGet]
        public User Get()
        {
            return new User { UserId = 1332, Username = "Michal" };
        }
    }
错误

<HTML><HEAD><TITLE>Bad Request</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Bad Request - Invalid Hostname</h2>
<hr><p>HTTP Error 400. The request hostname is invalid.</p>
请求错误
错误的请求-无效的主机名
HTTP错误400。请求主机名无效

我可以确认我在浏览器和邮递员上都获得了数据。
谢谢你的帮助。

好的,我通过一步一步地调试解决了这个问题

看起来Android不喜欢自签名证书,因此我最终无法将其设置为使用HTTPS

我所做的是让它与唯一的HTTP一起工作,以下是步骤:

  • 将IIS更改为本地运行时环境(默认情况下为项目名称)
  • 删除app.UseHttpsRedirection()
  • 我们现在启用了对服务器的HTTP请求。接下来是通过本地运行时环境运行服务器(我们可以在VS中的调试按钮中更改)

    现在,我们应该能够在Android Emulator中使用http请求访问浏览器中的api,例如
    http://localhost:5000/weatherforcast
    。 请记住,默认情况下,ASP.NET Core 3.0在端口5001上提供HTTPS,在端口5000上提供HTTP

    接下来,Android为服务器正在运行的本地机器的IP使用别名,因此我们不必编写
    localhost:
    ,而必须编写
    10.0.2.2:

    最后,我简化了客户端中的api调用,如下所示:

    static Future<Profile> getUserProfile() async {
        String url = 'http://10.0.2.2:5000/weatherforecast';
        final reply = await http.get('$url');
        var responseJson = json.decode(reply.body);
        return Profile.fromJson(responseJson);
      }
    
    静态未来getUserProfile()异步{
    字符串url='0http://10.0.2.2:5000/weatherforecast';
    final reply=wait http.get(“$url”);
    var responseJson=json.decode(reply.body);
    返回Profile.fromJson(responseJson);
    }
    
    非常有用

    只有一件事,我被困在你该去的地方

    What comes next is running the server through our local runtime environment (which we can change in a Debug button in VS).
    
    为此:

    • 打开项目属性并将应用程序URL设置为仅http

    要解决此问题,首先我们需要了解Android Emulator的工作方式:

    您应该了解的第一个技巧是Android emulator(一个 虚拟设备)有自己的网络。所以谷歌定义了一个神奇的IP 地址“10.0.2.2”。如果尝试浏览到此IP地址,则 请求将路由到主机的“127.0.0.1”环回适配器 机器。(稍后我将为您提供有关魔法路由的证明。)

    很简单:如果你把
    localhost
    放在地址上,它会攻击自己的android仿真器网络。因此,如果我们把
    10.0.0.2
    ,转换成
    127.0.0.1
    ,我们就能够访问我们的机器网络

    问题是,IIS没有对
    127.0.0.1:port
    address
    上的
    https
    请求进行绑定,只针对
    localhost:port
    。自己试试:运行.NET Core API,转到浏览器并键入
    127.0.0.1:port
    。您将直接收到400错误的请求错误

    那么,如何让IIS识别
    127.0.0.1:port
    地址呢? 您必须处理ISS Express配置文件并手动添加绑定。按照以下步骤操作:

    1-打开
    applicationHost.config
    项目文件。在VS2019中,它位于
    $(solutionDir)\.vs\{projectName}\config\applicationhost.config

    .vs
    文件夹是隐藏的,因此请确保告诉您的文件资源管理器显示隐藏的目录。 对于其他Visual Studio版本,请查看以下链接:

    2-CRTL+F搜索
    端口:localhost
    ,您将找到已为项目配置的绑定行

    3-为
    https
    协议和
    127.0.0.1:port
    地址插入一行。您的绑定现在应该如下所示:

    static Future<Profile> getUserProfile() async {
        String url = 'http://10.0.2.2:5000/weatherforecast';
        final reply = await http.get('$url');
        var responseJson = json.decode(reply.body);
        return Profile.fromJson(responseJson);
      }
    
    
    
    现在,返回浏览器并尝试访问
    127.0.0.1:port
    。你应该做到没有任何错误。颤振应用程序也是如此。享受吧


    参考资料:

    正是我需要的。谢谢你!这仍然有效!谢谢。我的上帝,你从不必要的配置中拯救了我。我花了5个多小时寻找答案,这帮了我很大的忙谢谢汉克斯,这太棒了。我一直在追踪一切,只有你的解决方案有效。