COM包装的dll在经典的asp / vbscript文件中没有创建对象

时间:2011-12-13 16:21:38

标签: c# dll com asp-classic vbscript

我试图在经典的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;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

以下是您可能想要检查的事项列表

答:此错误表示“无效的类字符串” - 换句话说,对CreateObject的调用失败,因为OLE子系统无法找到名称对象。原因包括:

  1. 毕竟你真的没有在服务器上运行regsvr32。
  2. 您运行了regsvr32,但报告错误。
  3. 某人修改了部分注册表的安全性,阻止OLE子系统读取全部或部分HKEY_CLASSES_ROOT树。
  4. 您尝试创建的对象的名称拼写错误或不正确。
  5. 确定是否是权限问题
  6. 将匿名用户(由IIS使用)添加到Administrators组。测试页然后工作,证明这是一个权限问题。不要忘记从Admin组中删除匿名IIS用户!

    1. 确定它是否是文件权限问题:
    2. 从Admin组中删除匿名用户后,将失败审核添加到文件(smtpsvg.dll),这将确定是否曾访问该文件(由于缺少失败事件)。如果不是,则表明故障发生在文件访问之前,但请继续检查文件/目录权限以确保匿名IIS用户可以访问该文件。

      1. 检查注册表权限
      2. 使用Regedt32,在smtpsvg.dll上找到。检查密钥(和子密​​钥)的权限,并确保匿名用户具有读取权限。查找包含位置值和版本的class-id,并检查这些权限。

答案 1 :(得分:0)

您是否已使用VBScript或消耗COM的其他语言将.NET组件测试为COM组件?

在我看来,.NET代码中的属性集是正确的。您已经为IAddressValidationAddressValidation提供了相同的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,那么它可能值得尝试。