我正在创建一个 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 握手的问题。我的解决方案:
关于ios - Xamarin iOS ModernHttpClient Owin OAuth2 Bearer Token Authentication DefaultHeader 导致 "System.Net.WebException: cannot parse response",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37442371/