【问题标题】:Xamarin iOS (WebClient IPv6 Rejection)Xamarin iOS(WebClient IPv6 拒绝)
【发布时间】:2016-11-09 13:51:45
【问题描述】:

我的 Apple AppStore 应用程序因不支持 IPv6 网络而被拒绝。

这是我的 WebClient 的服务器 URL 声明。 “ipv4”是服务器的 IPv4 地址。为了安全起见,我没有在此处添加它。

RemoteServerConnector.Instance.DefaultServerUrl = "http://ipv4/api.php"; 

然后我有这个方法来检查连接:

   private class MyWebClient : WebClient {

    public int timeOut { get; set; }

    protected override WebRequest GetWebRequest(Uri address) {
        WebRequest w = base.GetWebRequest(address);
        w.Timeout = timeOut;
        return w;
    }
   }

   public bool checkInternetConnection() {
            try {
                using(MyWebClient client = new MyWebClient()) {
                    client.timeOut = ApiUrls.RemoteServerConnectorTestTimeout;
                    var removeString = "api.php";
                    var testHttp = DefaultServerUrl.EndsWith(removeString) ? DefaultServerUrl.Remove(DefaultServerUrl.Length - removeString.Length, removeString.Length) : DefaultServerUrl;            

                    using(client.OpenRead(testHttp)) {
                        return true;
                    }
                }
            } catch(WebException ex) {
                return ex.Status != WebExceptionStatus.ConnectFailure;
            } catch(Exception ex) {
                return false;
            }
        }

它总是在 IPv6 网络中抛出异常。我已经尝试过这个解决方案Xamarin iOS IPv6 App Store Rejection,但它不起作用。我还尝试在变量 DefaultServerUrl 中添加 IPv6 而不是 IPv4。我也试过http://ipv6/api.phphttp://[ipv6]/api.php

找不到此类连接 (WebClient) 的任何解决方案。我只找到了使用 TCP/IP 协议的其他解决方案,我不想在我的应用中更改它。

我还看到了有关 IPv6 的 Xamarin 博客,但我不知道该怎么做。由于权限问题,无法为其添加链接。

我应该对我的代码进行哪些更改才能使其正常工作?谢谢你的时间:)

【问题讨论】:

  • IP 地址不是私人信息。在任何情况下,您都不能使用 IP 地址文字。
  • 那么,当我用主机名替换 IP 时,它会起作用,对吧?
  • 我尝试将 IP 更改为主机名,但仍然无法正常工作。然后我尝试将 WebClient 更改为 HttpClient(也尝试了 ModernHttpClient)。在 IPv6 网络上测试时仍然无法正常工作。

标签: c# ios xamarin xamarin.ios ipv6


【解决方案1】:

当我尝试了几乎所有方法但都不起作用时,我检查了客户服务器的设置。没有 IPv6 的设置。我们修复了它,现在它与 ModernHttpClient 一起使用。我将应用程序从 IPv4 地址切换到主机名。

我的 ModernHttpClient 代码。

                var handler = new NativeMessageHandler();
                using (var client = new HttpClient(handler))
                {
                    client.Timeout = TimeSpan.FromMilliseconds(ApiUrls.RemoteServerConnectorTestTimeout);
                    var removeString = "api.php";
                    var testHttp = DefaultServerUrl.EndsWith(removeString) ? DefaultServerUrl.Remove(DefaultServerUrl.Length - removeString.Length, removeString.Length) : DefaultServerUrl;

                    using (client.GetAsync(testHttp).Result)
                    {
                        return true;
                    }

                }

【讨论】:

    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2016-12-07
    • 2017-01-13
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多