如何通过Web代理使用.Net Remoting?

时间:2010-01-08 11:22:18

标签: c# .net wcf proxy remoting

我正在编写的应用程序需要使用.Net Remoting(我知道WCF是'新事物',但遗憾的是,目前我们无法使用它。)

无论如何,如果我不尝试通过代理使用该应用程序,一切正常。但是,应用程序需要能够通过代理Web服务器运行。我设置了一个HttpChannel并将'proxyName'和'proxyPort'属性设置为正确的值。这允许通道使用代理服务器没问题。

我有以下问题:

1:如果代理服务器需要身份验证,则似乎无法设置通道用于使用代理进行身份验证的凭据。我已经尝试了'凭证'属性,以及'用户名'和'密码'属性,但它似乎不起作用。因此,最终结果是代理服务器需要身份验证,并且只要在调用远程方法时返回身份验证错误。

2:我似乎无法让HttpChannel使用默认的系统Web代理。如果Internet Explorer配置为使用代理,我应该能够使用WebRequest.GetSystemWebProxy()来获取它。但是,这会返回一个IWebProxy,我无法从中提取主机和端口。如果有人知道如何做到这一点,我将非常感激。

令人沮丧的是,如果您使用Visual Studio单步执行代码并检查HttpChannel类,则会有一个WebProxy对象。如果他们提供访问权限,那么生活会变得如此简单!

所以基本上我要问的是我是如何让HttpChannel正确使用Web代理的 - 请记住我需要能够使用需要身份验证的代理,以及自动检测的能力Internet Explorer代理设置?是否有更简单的方法来实例化通道,以便我可以将代理对象作为参数传递给它?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

我找到了这个问题的解决方案(不幸的是我丢失了导致我这个问题的博客地址 - 如果我能再次找到它我将给予应有的信任),并且它完美无缺。对于任何感兴趣的人,请添加以下代码:

    private static void SetChannelProxy(HttpClientChannel channel, IWebProxy proxy)
    {
        FieldInfo proxyObjectFieldInfo = typeof(HttpClientChannel).GetField("_proxyObject", BindingFlags.Instance | BindingFlags.NonPublic);

        proxyObjectFieldInfo.SetValue(channel, proxy);
    }

您应首先使用您要使用的凭据配置代理对象,然后使用要与代理一起使用的通道调用此方法。