【问题标题】:Access to web service wit IPv4 and IPv6 for iOS app created in Visual Studio with Xamarin使用 Xamarin 在 Visual Studio 中创建的 iOS 应用使用 IPv4 和 IPv6 访问 Web 服务
【发布时间】:2018-07-23 12:27:13
【问题描述】:

我使用 Xamarin 在 VS 中创建 iOS 应用程序,从服务器获取信息(文本/图像/等)。首先,我通过域名(如http://domainname.com/getinfo?params=xyz)访问服务器。这适用于 IPv4 和 IPv6。但是现在我必须使用通过IP号访问服务器。服务器同时具有 IPv4 号码和 IPv6 号码。要获取信息,我使用带有查询字符串的 HttpClient,例如“http://xxx.xxx.xxx.xxx/getinfo?params=xyz”,这在设备通过 IPv4 连接到网络时有效。但是当设备通过 IPv6 连接到网络时,它不起作用(正如 iTunes 连接所说)。 有人可以帮我吗?

更新

代码示例:

public class CampaignData
{
    public int _campaignId;
    public string _campaignName;
    public string _campaignDescription;
    public CampaignData(int campaignId, string campaignName, string campaignDescription){
        _campaignId=_campaignId;
        _campaignName=campaignName;
        _campaignDescription=campaignDescription;
    }
}
public class DataService
{
    private static string _requestUri = "http://xxx.xxx.xxx.xxx/getinfo/";
    private static string _requestUriV6 = "http://xxxx:xxxx:x:xxx:xxxx:xxxx:xxxx:xxxx/getinfo/";
    public static async Task<List<CampaignData>> GetCampaignsList(string lang)
    {
        string queryString = _requestUri + "get_campaigns_list.php?lang="+lang;
        HttpClient client = new HttpClient();
        var response = await client.GetAsync(queryString);
        dynamic data = null;
        if (response != null)
        {
            List<CampaignData> campaignsList = new List<CampaignData>();
            string json = response.Content.ReadAsStringAsync().Result;
            data = JsonConvert.DeserializeObject(json);
            if (data["status"] == "success")
            {
                foreach (var campaign in data["campaigns"])
                {
                    int id = campaign["idx"];
                    string description = campaign["description"];
                    string name = campaign["description"];
                    campaignsList.Add(new CampaignData(id, name, description));
                }
                return campaignsList;
            }
            else
            {
                return null;
            }
        }
        return null;
    }
}

【问题讨论】:

  • 请显示您要执行的操作的代码。我的第一个猜测是您没有使用文字 IPv6 地址正确构建 URL。另外:通过 IP 地址访问服务器是一个非常糟糕的主意,但这不是你的问题 :)
  • @SanderSteffann 我知道这是个坏主意,但不幸的是,客户并不关心。
  • 您不应使用 IP 地址文字。这可能会导致您的应用被拒绝。始终使用域名。如果您的客户不关心在 App Store 中的存在,那么我想这没关系....
  • @MichaelHampton 所以不可能使用 IPv6 访问服务器,不是吗?
  • 我不知道你在说什么。您当然可以使用 IPv6!您不能使用文字地址。您必须使用域名。

标签: ios visual-studio xamarin.ios ipv6 ipv4


【解决方案1】:

IPv6 地址文字必须用[] 围绕它们进行编码:

private static string _requestUriV6 = "http://[2001:db8::1]/getinfo/";

端口号可以选择在] 之后:

private static string _requestUriV6 = "http://[2001:db8::1]:80/getinfo/";

请警告您的客户,在仅支持 NAT64 而不支持本机 IPv6 的 IPv6 网络上(例如 Apple 设备提供的 test-network)。因此,您当前的代码可能仍会被拒绝。他们会mention how you could deal with address literals,但明确建议不要这样做。

【讨论】:

  • 但是应用程序如何理解何时使用 IPv4 以及何时使用 IPv6?
  • 这是个大问题。这就是为什么强烈建议使用主机名而不是文字 IP 地址的原因,以便操作系统可以自动识别它。
  • 这就是我问这个问题的原因。有域名我没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
相关资源
最近更新 更多