2011-12-13 42 views
2

我試圖在經典的asp/vbscript文件中使用COM包裝的dll,但無法創建該對象。在一個經典的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

您是否有機會查看可能導致您正在查看的問題的可能事項列表..? – MethodMan

+0

64位服務器?託管ASP應用程序的應用程序池的位數是多少? – AnthonyWJones

回答

1
Here is a list of things you may want to check 

甲:該錯誤裝置「無效的類字符串」 - 換句話說調用CreateObject失敗,因爲OLE子系統找不到名稱對象。原因包括:

  1. 您確實沒有在服務器上運行regsvr32。
  2. 您運行了regsvr32,但報告了錯誤。
  3. 有人修改了部分註冊表的安全性,使得OLE子系統無法讀取全部或部分HKEY_CLASSES_ROOT樹。
  4. 您嘗試創建的對象的名稱被拼寫錯誤或不正確。
  5. 確定它是否是一個權限問題

匿名用戶(IIS使用的)添加到管理員組。測試頁然後工作,證明這是一個權限問題。不要忘記從管理員組中刪除匿名IIS用戶!

  1. 確定是否它是一個文件權限問題:

從管理組中刪除匿名用戶後,添加失敗審覈到該文件(smtpsvg.dll),這將確定是否該文件是曾經訪問過(由於缺乏故障事件)。如果不是,則表明失敗在文件訪問之前,但請繼續並檢查文件/目錄權限,以確保匿名IIS用戶可以訪問該文件。

  1. 檢查註冊表權限

使用REGEDT32,的確發現在smtpsvg.dll。檢查密鑰(和子密​​鑰)的權限,並確保匿名用戶具有讀權限。查找包含位置值和版本的class-id,並檢查這些權限。

0

您是否已將.NET組件作爲VBScript的COM組件或其他消耗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就可以嘗試它。