RestSharp可移植RestClient代理属性不起作用

时间:2014-06-21 10:12:19

标签: c# proxy xamarin restsharp

这是什么问题。我正在使用便携式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;

enter image description here

强文

1 个答案:

答案 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

上添加了新问题