Webclient.Headers上的自动化错误

时间:2014-04-14 07:17:50

标签: vb6

使用Headers属性时,我在以下代码中出错:

Public Function UploadImage(image As String) As String

Dim wc As System.WebClient

'create WebClient

Set wc = CreateObject("System.Net.WebClient")

Call wc.Headers.Add("Authorization", "Client-ID " & ClientId) <------- Error occurs here

1 个答案:

答案 0 :(得分:0)

我尽可能地重复你的问题。你没有提到你得到的错误是什么,但我得到了:

Automation error -2146233079   (80131509)

我尝试使用

CallByName(wc, "Headers", VbGet)

...但这只是返回

Automation error 440.

哦,好吧......

我在网上查了一下,发现了this link。我的猜测是因为WebHeaderCollection类的基类不是COM Visible,这会导致错误。

我的解决方法是在小型.NET组件中包含此功能,并使该COM可见。

这方面的一个例子是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Runtime.InteropServices;
using System.Text;

namespace WebClientWrapper
{
    [ComVisible(true)]
    [Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
    public class WebClientWrapper : WebClient
    {
        [ComVisible(true)]
        public WebHeaderCollectionWrapper WHeaders
        {
            get 
            {
                return new WebHeaderCollectionWrapper(base.Headers);
            }
        }
    }

    [ComVisible(true)]
    [Guid("yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy")]
    public class WebHeaderCollectionWrapper
    {
        WebHeaderCollection _whc;

        internal WebHeaderCollectionWrapper(WebHeaderCollection whc)
        {
            _whc = whc;
        }

        [ComVisible(true)]
        public void Add(string name, string value)
        {
            _whc.Add(name, value);
        }

        [ComVisible(true)]
        public void Clear()
        {
            _whc.Clear();
        }
    }
}

(您必须使用自己的值替换GUID - 使用GUIDGEN.EXE)。

使用CreateObject("WebClientWrapper.WebClientWrapper")

实例化此组件

现在,您只需将对Headers属性的引用替换为WHeaders(或者您想要调用的任何内容)。 WHeaders为您提供WebHeaderCollection的真正包装 - 您必须自己定义所有其他包装的方法和属性。我希望将WHeaders定义为public WebHeaderCollectionWrapper,但这似乎不起作用。

由于WebClientWrapper继承自WebClient,因此您应该能够使用大多数属性和方法。如果遇到麻烦,只需在类中添加新方法,包含无法使用VB的功能。

哦,并且记得在Project Properties =&gt;处设置复选框。 Build =&gt;输出=&gt;注册COM互操作。然后引用创建的类型库。