使用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
答案 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互操作。然后引用创建的类型库。