ios - Xamarin iOS ModernHttpClient Owin OAuth2 Bearer Token Authentication DefaultHeader 导致 "System.Net.WebException: cannot parse response"

标签 ios rest xamarin xamarin.ios xamarin.forms

我正在创建一个 Xamarin Forms 概念验证,但由于发布到我的休息服务的问题而遇到了一些障碍。 rest 服务是使用 OAuth Bearer Tokens 的 Web API 2 Rest 服务。我让它通过 https 使用有效的 SSL 证书运行。

我可以在设备上获得 token ,但是,使用 Bearer token 授权 header 发布会导致

System.Net.WebException: cannot parse response.

如果我省略授权 header ,由于身份验证,请求在服务器上失败。如果我包含它,请求永远不会发送到服务器(使用 charles 代理来验证)。

“rest client”是一个简单的 HttpClient 包装器,以 ModernHttpClient 作为提供者,在 PCL 中定义。 “休息客户端”在控制台应用程序中工作得很好。我想我在 iOS 中看到了与身份验证 header 相关的较低级别的异常...

这就是我在 PCL 中构建 HttpClient 的方式:

        Client = new HttpClient(new NativeMessageHandler());
        Client.MaxResponseContentBufferSize = 256000;
        Client.BaseAddress = new Uri("https://rest-dev.mysub.mydomain.com");

        Client.DefaultRequestHeaders.Accept.Clear();
        Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Authentication.AuthorizationToken); // Authentication is where I store the token

然后我发布模型:

        var strContent = JsonConvert.SerializeObject(model);
        var content = new StringContent(strContent, Encoding.UTF8, "application/json");
        HttpResponseMessage response = await client.PostAsync($"api/devices", content);

所有这些都包含在一个测试应用程序中,该应用程序使用相同的 PCL 发布到服务器。

不确定它是否重要,但如果它确实重要,在 Xamarin Forms PCL 中,这将在登录时的新命令中调用(在获得 token 后)。

无论是在 iOS 模拟器还是在我的设备上运行,我都出现同样的错误。

我发现有趣的是,当我不使用 ModernHttpClient 作为提供者时,我在尝试获取 token 时会收到不同的错误:

"System.Net.WebException: Error: SendFailure (Error writing headers)"

对此的研究引导我走上了设置有效 SSL 的道路。

任何在正确方向上的帮助将不胜感激。我的 google-fu 在墙上。

更新

我想我已经解决了这个问题,它与 SSL 证书有关。我使用了 Charles Proxy 并安装了它的证书来调试连接,它才刚刚开始工作。不过,如果不使用 Charles Proxy,仍然无法正常工作。

最佳答案

这原来是 IIS SSL 握手的问题。我的解决方案:

https://serverfault.com/a/779895/42134

关于ios - Xamarin iOS ModernHttpClient Owin OAuth2 Bearer Token Authentication DefaultHeader 导致 "System.Net.WebException: cannot parse response",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37442371/

相关文章:

rest - RESTful Web 服务与仅使用简单的 Servlet 相比有什么好处?

c# - 设置 xamarin toolbaritems 的背景颜色

ios - 按顺序循环数组并重复

iphone - 自定义 iOS 中的小数垫

ios - UITextview typingAttributes 不起作用

ios - PCL 中的 HttpClient 调用在 iOS 中不起作用

java - Jersey - Spring 3 Autowiring (NoClassDefFoundError : EnvironmentAware)

c# - 如何在 Xamarian iOS 应用程序中单击按钮 X 秒后触发事件?

c# - for循环中的字符串连接导致应用程序停止 - Xamarin

IOS:了解 uiwebview 是否已停止滚动