这是什么问题。我正在使用便携式RestSharp,它使用HttpClient。但对于iOS,HttpClient存在问题,因为Default IWebProxy实例不允许使用Charles(look here等请求监视软件监视请求以查看问题和解决方案)
解决方法是使用CFNetwork.GetDefaultProxy ()
返回IWebProxy
并将其设置为请求的代理。我尝试设置RestClient
的代理属性,但是在挖掘可移植RestClient
的开源代码时它没有用,我发现代理属性没有在任何地方使用。它被使用的唯一地方被注释掉了。该方法在ConfigureProxy
项目RestSharp.Portable
文件中称为RestClient
行572,并且此方法仅从ConfigureHttp
方法行541调用相同的文件,该文件也被注释掉。我相信这是一个错误。可能有人在评论出这段代码后忘记设置代理。那么有人可以告诉我,删除注释行是否安全,或者可以说是设置IHttp接口代理的正确位置?例如,在附加图像的第393行(这又是在RestClient文件中)设置代理是安全的,例如
httpRequest.Proxy = this.Proxy;
强文
答案 0 :(得分:1)
在调试RestSharp.Portable 3.1.0源代码2天后,我自己解决了这个问题。
有一个错误
#include <iostream>
using namespace std;
long double Determinant_3x3(long double matrix_3x3[3][3])
{
long double determinant;
determinant = matrix_3x3[0][0] * matrix_3x3[1][1] * matrix_3x3[2][2] + matrix_3x3[0][1] * matrix_3x3[1][2] * matrix_3x3[2][0] + matrix_3x3[0][2] * matrix_3x3[1][0] * matrix_3x3[2][1] - matrix_3x3[0][2] * matrix_3x3[1][1] * matrix_3x3[2][0] - matrix_3x3[0][1] * matrix_3x3[1][0] * matrix_3x3[2][2] - matrix_3x3[0][0] * matrix_3x3[1][2] * matrix_3x3[2][1];
return determinant;
}
long double Cramer_3x3(long double d[3], long double matrix_3x3[3][3], int step)
{
long double result;
if(step == 0){
long double matrix_3x3d[3][3] = {d[0], matrix_3x3[0][1], matrix_3x3[0][2], d[1], matrix_3x3[1][1], matrix_3x3[1][2], d[2], matrix_3x3[2][1], matrix_3x3[2][2]};
result = Determinant_3x3(matrix_3x3d)/Determinant_3x3(matrix_3x3);
}
else if(step == 1){
long double matrix_3x3d[3][3] = {matrix_3x3[0][0], d[0], matrix_3x3[0][2], matrix_3x3[1][0], d[1], matrix_3x3[1][2], matrix_3x3[2][0], d[2], matrix_3x3[2][2]};
result = Determinant_3x3(matrix_3x3d)/Determinant_3x3(matrix_3x3);
}
else{
long double matrix_3x3d[3][3] = {matrix_3x3[0][0], matrix_3x3[0][1], d[0], matrix_3x3[1][0], matrix_3x3[1][1], d[1], matrix_3x3[2][0], matrix_3x3[2][1], d[2]};
result = Determinant_3x3(matrix_3x3d)/Determinant_3x3(matrix_3x3);
}
return result;
}
int main()
{
long double d[3], matrix_3x3[3][3], result[3];
cout << "Voer een 3x3 matrix in.\n";
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++){
cin >> matrix_3x3[i][j];
}
}
cout << "Voer d1, d2 en d3 in.\n";
for(int k = 0; k < 3; k++){
cin >> d[k];
result[k] = Cramer_3x3(d[3], matrix_3x3[3][3], k); //line 51, where the error happens
}
cout << "Het ingevoerde stelsel ziet er zo uit.\n" << matrix_3x3[0][0] << "x + " << matrix_3x3[0][1] << "y + " << matrix_3x3[0][2] << "z = " << d[0] << endl << matrix_3x3[1][0] << "x + " << matrix_3x3[1][1] << "y + " << matrix_3x3[1][2] << "z = " << d[1] << endl << matrix_3x3[2][0] << "x + " << matrix_3x3[2][1] << "y + " << matrix_3x3[2][2] << "z = " << d[2] << endl << "x = " << result[0] << "\ny = " << result[1] << "\nz = " << result[2] << endl;
return 0;
}
- 项目
RestSharp.Portable.HttpClient.Shared
- 班级
DefaultHttpClientFactory
- 方法
原始代码是:
CreateMessageHandler
代码不起作用,因为if (handler.SupportsProxy && _proxyProperty != null && proxy != null)
{
_proxyProperty.SetValue(handler, new RequestProxyWrapper(proxy), null);
}
为空。该字段通过反射在构造函数中初始化。
_proxyProperty
模拟器很好地初始化了这个属性,但真正的iOS设备没有。我不知道为什么会这样。
所以,这是包含修复程序的代码:
_proxyProperty = typeof(HttpClientHandler).GetProperty("Proxy");
我已使用反射将此修复添加到我的应用程序中。如果你想做同样的事情,你应该包装你的验证器或实现虚拟验证器并覆盖两种方法:
if (handler.SupportsProxy && proxy != null)
{
handler.Proxy = new RequestProxyWrapper(proxy);
}
和
public override bool CanPreAuthenticate(IHttpClient client, IHttpRequestMessage request, ICredentials credentials)
{
return true;
}
希望这有帮助。不要忘记在每个平台上测试你的解决方案:)
我在github FubarDevelopment/restsharp.portable