【问题标题】:RestSharp portable RestClient Proxy property is not workingRestSharp 便携式 RestClient 代理属性不起作用
【发布时间】:2014-06-21 10:12:19
【问题描述】:

这就是问题所在。我正在使用便携式 RestSharp,它在后台使用 HttpClient。但是对于 iOS,HttpClient 存在问题,因为 Default IWebProxy 实例不允许使用像 Charles 这样的请求监控软件来监控请求(look here 查看问题和解决方案) 解决方案是使用 CFNetwork.GetDefaultProxy () 返回 IWebProxy 并将其设置为请求的代理。我尝试设置RestClient 的 Proxy 属性,但没有成功,在挖掘可移植RestClient 的开源代码时,我发现 Proxy 属性在任何地方都没有使用。唯一使用它的地方被注释掉了。该方法在RestSharp.Portable 项目RestClient 文件中称为ConfigureProxy 第572 行,并且仅从ConfigureHttp 方法第541 行相同的文件中调用此方法,该文件也被注释掉了。我相信这是一个错误。可能是有人在注释掉此代码后忘记设置代理。那么有人可以告诉我删除注释行是否安全,或者可以说设置IHttp接口代理的正确位置?例如,在附加图像的第 393 行(这又在 RestClient 文件中)设置代理是否安全,例如

httpRequest.Proxy = this.Proxy;

强文本

【问题讨论】:

    标签: c# proxy xamarin restsharp


    【解决方案1】:

    在调试 RestSharp.Portable 3.1.0 源代码 2 天后,我自己解决了这个问题。


    RestSharp.Portable.HttpClient.Shared - 项目
    DefaultHttpClientFactory - 类
    CreateMessageHandler - 方法中有一个错误

    原代码为:

    if (handler.SupportsProxy && _proxyProperty != null && proxy != null)
    {
        _proxyProperty.SetValue(handler, new RequestProxyWrapper(proxy), null);
    }
    

    代码不起作用,因为_proxyProperty 为空。该字段在构造函数中通过反射进行初始化。

    _proxyProperty = typeof(HttpClientHandler).GetProperty("Proxy");
    

    模拟器很好地初始化了这个属性,但真正的 iOS 设备没有。我不知道为什么会这样。

    所以,这里是包含修复的代码:

    if (handler.SupportsProxy && proxy != null)
    {
        handler.Proxy = new RequestProxyWrapper(proxy);
    }
    

    我已使用反射将此修复程序添加到我的应用程序中。如果你想做同样的事情,你应该包装你的验证器或实现一个虚拟的并覆盖两种方法:

    public override bool CanPreAuthenticate(IHttpClient client, IHttpRequestMessage request, ICredentials credentials)
    {
        return true;
    }
    

    public override async Task PreAuthenticate(IHttpClient client, IHttpRequestMessage request, ICredentials credentials)
    {
    ...
        // get private "handler" field of type DefaultHttpClient from client by reflection here
        // get private "proxy" field of type IWebProxy from "handler" by reflection here
        // set private "proxy" field if it's null by reflection here
    ...
    }
    

    希望对您有所帮助。不要忘记在每个平台上测试您的解决方案:)

    我在github FubarDevelopment/restsharp.portable 添加了新问题

    【讨论】:

    • 事实上,这个带有代理属性反射的代码是作为 Xamarin 的一种解决方法,因为即使代理属性应该可用,当你想使用它时它也会引发异常。我将提供一个尝试使用该字段的更新,而不是找不到代理。
    • 我发现了一个异常,它说属性代理也没有设置器。我不知道为什么会这样。我想您使用私有字段的新解决方法可以正常工作。非常感谢。
    • 在 3.1.1 中修复(请在问题仍然存在时提出问题)
    • 问题依然存在。请看my comment
    • 在 3.1.3 中修复。感谢马克
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多