我试图在经典的asp / vbscript文件中使用COM包装的dll但是无法创建对象。
DLLTest.asp文件为我提供了以下错误:
Server object error 'ASP 0177 : 800401f3'
Server.CreateObject Failed
/DLLTest.asp, line 6
800401f3
如果我使用if语句集,我发现检查了对象的存在,我收到以下内容:
Microsoft VBScript runtime error '800a01ad'
ActiveX component can't create object: 'AddressVerification.AddressValidation'
/DLLTest.asp, line 7
因此无法创建对象。当我在注册表上运行搜索时,似乎有一个可用的密钥,因此这似乎已经注册。
.bat文件使用以下代码编写:
"C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil.exe" -i AddressVerification.dll
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe AddressVerification.dll
DLLTest.asp:
<%
'Dim word, object
'object=Server.CreateObject("AddressVerification.AddressValidation")
'word=object.testMethod()
if isObject(Createobject("AddressVerification.AddressValidation")) then
response.write "installed."
else
response.write "not installed."
end if
%>
<HTML>
</HTML>
AddressValidation.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using System.Xml;
using System.Runtime.InteropServices;
using AddressVerification.Components;
namespace AddressVerification
{
[ComVisible(true), GuidAttribute("41ef43e1-c1af-4a53-936b-8b6cc62ac534")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IAddressValidation
{
/* string m_AccessLicenseNumber;
string m_UserId;
string m_Password;
string Password
{
get { return m_Password; }
set { m_Password = value; }
}
string UserId
{
get { return m_UserId; }
set { m_UserId = value; }
}
string AccessLicenseNumber
{
get { return m_AccessLicenseNumber; }
set { m_AccessLicenseNumber = value; }
} */
string Password {get; set;}
string UserId {get; set;}
string AccessLicenseNumber {get; set;}
string testMethod();
string ValidateCityStateZip(string City, string StateProvinceCode, string PostalCode);
string ValidateStreetLevel(string ConsigneeName, string BuildingName, string AddressLine1, string AddressLine2, string AddressLine3, string City, string StateProvinceCode, string PostcodePrimaryLow, string PostcodeExtendedLow, string CountryCode);
}
[ComVisible(true), GuidAttribute("41ef43e1-c1af-4a53-936b-8b6cc62ac534")]
[ProgId("AddressVerification.AddressValidation")]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class AddressValidation : IAddressValidation
{
#region Local Variables
private string m_AccessLicenseNumber;
private string m_UserId;
private string m_Password;
#endregion
#region Constructor
public AddressValidation()
{
}
public AddressValidation(string accessLicenseNumber, string userId, string password)
{
m_AccessLicenseNumber = accessLicenseNumber;
m_UserId = userId;
m_Password = password;
}
#endregion
#region Properties
public string Password
{
get { return m_Password; }
set { m_Password = value; }
}
public string UserId
{
get { return m_UserId; }
set { m_UserId = value; }
}
public string AccessLicenseNumber
{
get { return m_AccessLicenseNumber; }
set { m_AccessLicenseNumber = value; }
}
#endregion
public string testMethod()
{
string foo = "hooray!";
return foo;
}
public string ValidateCityStateZip(string City, string StateProvinceCode, string PostalCode)
{
string result = "";
string requestString = "";
AccessRequest AccessReq = new AccessRequest(this.AccessLicenseNumber, this.UserId, this.Password);
requestString += SerializeObj(AccessReq).InnerXml;
// TODO: Use serialize object instead of fix xml code.
requestString +=string.Format(@"<?xml version='1.0'?>
<AddressValidationRequest xml:lang='en-US'>
<Request>
<TransactionReference>
<CustomerContext>Customer Data</CustomerContext>
<XpciVersion>1.0001</XpciVersion>
</TransactionReference>
<RequestAction>AV</RequestAction>
</Request>
<Address>
<City>{0}</City>
<StateProvinceCode>{1}</StateProvinceCode>
<PostalCode>{2}</PostalCode>
</Address>
</AddressValidationRequest>", City, StateProvinceCode, PostalCode);
// Return data in xml format
result = UPSRequest("https://www.ups.com/ups.app/xml/AV", requestString);
// TODO: Serialize return string to object
return result;
}
public string ValidateStreetLevel(string ConsigneeName, string BuildingName, string AddressLine1, string AddressLine2, string AddressLine3, string City, string StateProvinceCode, string PostcodePrimaryLow, string PostcodeExtendedLow, string CountryCode)
{
string result = "";
string requestString = "";
AccessRequest AccessReq = new AccessRequest(this.AccessLicenseNumber, this.UserId, this.Password);
requestString += SerializeObj(AccessReq).InnerXml;
requestString += string.Format(@"<?xml version='1.0'?>
<AddressValidationRequest xml:lang='en-US'>
<Request>
<TransactionReference>
<CustomerContext />
<XpciVersion>1.0001</XpciVersion>
</TransactionReference>
<RequestAction>XAV</RequestAction>
<RequestOption>3</RequestOption>
</Request>
<MaximumListSize>3</MaximumListSize>
<AddressKeyFormat>
<ConsigneeName>{0}</ConsigneeName>
<BuildingName>{1}</BuildingName>
<AddressLine>{2}</AddressLine>
<AddressLine>{3}</AddressLine>
<AddressLine>{4}</AddressLine>
<PoliticalDivision2>{5}</PoliticalDivision2>
<PoliticalDivision1>{6}</PoliticalDivision1>
<PostcodePrimaryLow>{7}</PostcodePrimaryLow>
<PostcodeExtendedLow>{8}</PostcodeExtendedLow>
<CountryCode>{9}</CountryCode>
</AddressKeyFormat>
</AddressValidationRequest>",
ConsigneeName, BuildingName,
AddressLine1, AddressLine2, AddressLine3,
City, StateProvinceCode, PostcodePrimaryLow, PostcodeExtendedLow, CountryCode);
// Return data in xml format
result = UPSRequest("https://onlinetools.ups.com/ups.app/xml/XAV", requestString);
// TODO: Serialize return string to object
return result;
}
private string UPSRequest(string url, string requestText)
{
string result = "";
ASCIIEncoding encodedData = new ASCIIEncoding();
byte[] byteArray = encodedData.GetBytes(requestText);
// open up da site
HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
wr.Method = "POST";
wr.KeepAlive = false;
wr.UserAgent = "Benz";
wr.ContentType = "application/x-www-form-urlencoded";
wr.ContentLength = byteArray.Length;
try
{
// send xml data
Stream SendStream = wr.GetRequestStream();
SendStream.Write(byteArray, 0, byteArray.Length);
SendStream.Close();
// get da response
HttpWebResponse WebResp = (HttpWebResponse)wr.GetResponse();
using (StreamReader sr = new StreamReader(WebResp.GetResponseStream()))
{
result = sr.ReadToEnd();
sr.Close();
}
WebResp.Close();
}
catch (Exception ex)
{
// Unhandle exception occure
result = ex.Message;
}
return result;
}
// Serialize Object to XML
private System.Xml.XmlDocument SerializeObj(Object obj)
{
System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument();
try
{
using (System.IO.MemoryStream myStream = new System.IO.MemoryStream())
{
System.Xml.Serialization.XmlSerializer xmlSer = new System.Xml.Serialization.XmlSerializer(obj.GetType());
xmlSer.Serialize(myStream, obj);
myStream.Position = 0;
xmlDoc.Load(myStream);
}
}
catch (Exception ex)
{
}
return xmlDoc;
}
}
}
答案 0 :(得分:1)
以下是您可能想要检查的事项列表
答:此错误表示“无效的类字符串” - 换句话说,对CreateObject的调用失败,因为OLE子系统无法找到名称对象。原因包括:
将匿名用户(由IIS使用)添加到Administrators组。测试页然后工作,证明这是一个权限问题。不要忘记从Admin组中删除匿名IIS用户!
从Admin组中删除匿名用户后,将失败审核添加到文件(smtpsvg.dll),这将确定是否曾访问该文件(由于缺少失败事件)。如果不是,则表明故障发生在文件访问之前,但请继续检查文件/目录权限以确保匿名IIS用户可以访问该文件。
使用Regedt32,在smtpsvg.dll上找到。检查密钥(和子密钥)的权限,并确保匿名用户具有读取权限。查找包含位置值和版本的class-id,并检查这些权限。
答案 1 :(得分:0)
您是否已使用VBScript或消耗COM的其他语言将.NET组件测试为COM组件?
在我看来,.NET代码中的属性集是正确的。您已经为IAddressValidation
和AddressValidation
提供了相同的Guid,因此有点奇怪。你真的希望你的.NET代码看起来像这样。
[ComVisible(true), Guid("41ef43e1-c1af-4a53-936b-8b6cc62ac534")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IAddressValidation
[ComVisible(true), Guid("ebef29ba-fa88-4644-b249-5b40f1ba19da")]
[ProgId("AddressVerification.AddressValidation")]
[ClassInterface(ClassInterfaceType.None)]
public class AddressValidation : IAddressValidation
您只希望AddressValidation
将默认界面公开给IAddressValidation
,以便该类本身应具有ClassInterfaceType.None
。
你应该做的另一件事是在执行regasm时包含/ Codebase,否则COM不知道在哪里找到实际的物理.dll文件。 Regasm会抱怨,但它会这样做。
实际上,我刚刚看到你正在安装到GAC中的划痕。但是,如果你还没有使用GAC并使用/ codebase,那么它可能值得尝试。