Dot-Net

在 IIS 7.0 上訪問 .asmx 頁面時出現“無法創建類型 XXXX”

  • November 21, 2010

當我嘗試在我的 Web 瀏覽器上訪問 .asmx 文件時出現此錯誤消息。消息如下:

說明:解析服務此請求所需的資源時出錯。請查看以下特定的解析錯誤詳細資訊並適當地修改您的源文件。

解析器錯誤消息:無法創建類型“GeocachingServerNS.GeocachingServer”。

源錯誤:

第 1 行:<%@ WebService Language=“C#” CodeBehind=“GeocachingServer.asmx.cs” Class=“GeocachingServerNS.GeocachingServer” %>

這是我的程式碼:

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Collections.Generic;

namespace GeocachingServerNS
{
   public class PlayerInfo
   {
       public string playerName;
       public Position position;

       public PlayerInfo()
       {
       }

       public PlayerInfo(string playerName, Position position)
       {
           this.playerName = playerName;
           this.position = position;
       }
   }

   public class CacheInfo
   {
       public string cacheName;
       public string creatorName;
       public int id;
       public Position position;
       public string hint;
       public string code;

       public CacheInfo()
       {
       }

       public CacheInfo(string cacheName, string creatorName, int id, Position position, string hint, string code)
       {
           this.cacheName = cacheName;
           this.creatorName = creatorName;
           this.id = id;
           this.position = position;
           this.hint = hint;
           this.code = code;
       }
   }

   public class Position
   {
       public double latitude;
       public double longitude;

       public Position()
       {
       }
   }

   public class Message
   {
       public string sender;
       public string content;

       public Message()
       {
       }
   }

   [WebService(Namespace = "http://ift604.usherbrooke.ca/", Name = "GeocachingServer")]
   [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
   [ToolboxItem(false)]
   public class GeocachingServer : System.Web.Services.WebService
   {
       public static int m_idCounter = 0;
       public static List&lt;CacheInfo&gt; m_cacheInfos = new List&lt;CacheInfo&gt;();
       public static List&lt;PlayerInfo&gt; m_playerInfos = new List&lt;PlayerInfo&gt;();
       public static Dictionary&lt;CacheInfo, List&lt;Message&gt;&gt; m_cacheComments = new Dictionary&lt;CacheInfo, List&lt;Message&gt;&gt;();
       public static Dictionary&lt;string, List&lt;Message&gt;&gt; m_mailboxes = new Dictionary&lt;string, List&lt;Message&gt;&gt;();

       /// &lt;summary&gt;
       /// Registers a new cache into the geocaching server.
       /// The cache will be visible to players.
       /// &lt;/summary&gt;
       /// &lt;param name="cacheName"&gt;&lt;/param&gt;
       /// &lt;param name="creatorName"&gt;&lt;/param&gt;
       /// &lt;param name="position"&gt;&lt;/param&gt;
       /// &lt;param name="hint"&gt;&lt;/param&gt;
       [WebMethod]
       public void RegisterCache(string cacheName, string creatorName, Position position, string hint, string code)
       {
           CacheInfo cacheInfo = new CacheInfo(cacheName, creatorName, m_idCounter, position, hint, code);
           m_cacheInfos.Add(cacheInfo);
           m_cacheComments[cacheInfo] = new List&lt;Message&gt;();

           ++m_idCounter;
       }

       /// &lt;summary&gt;
       /// Sends (updates) the position of a player to the geocaching server.
       /// &lt;/summary&gt;
       /// &lt;param name="position"&gt;&lt;/param&gt;
       /// &lt;param name="playerName"&gt;&lt;/param&gt;
       [WebMethod]
       public void SendPosition(Position position, string playerName)
       {
           PlayerInfo playerInfo = FindPlayer(playerName);
           if (playerInfo == null)
           {
               //TODO: Est-ce la meilleure façon de procéder, d'un point de vue
               //sécurité (flooding)? Non.
               m_playerInfos.Add(new PlayerInfo(playerName, position));
           }
           else
           {
               playerInfo.position = position;
           }
       }

       /// &lt;summary&gt;
       /// Removes a player from the geocaching game.
       /// &lt;/summary&gt;
       /// &lt;param name="playerName"&gt;&lt;/param&gt;
       [WebMethod]
       public void Disconnect(string playerName)
       {
           PlayerInfo playerInfo = FindPlayer(playerName);
           m_playerInfos.Remove(playerInfo);   //Fonctionne aussi avec null.
       }

       /// &lt;summary&gt;
       /// Returns positions of players nearby.
       /// &lt;/summary&gt;
       /// &lt;param name="playerName"&gt;The player that requests the positions.&lt;/param&gt;
       /// &lt;returns&gt;&lt;/returns&gt;
       [WebMethod]
       public List&lt;PlayerInfo&gt; GetPlayerPositions(String playerName)
       {
           //TODO: Retourner la position des joueurs qui sont près du joueur...
           return m_playerInfos;
       }

       /// &lt;summary&gt;
       /// Returns the list of all caches that exists in the server.
       /// &lt;/summary&gt;
       /// &lt;returns&gt;&lt;/returns&gt;
       [WebMethod]
       public List&lt;CacheInfo&gt; GetCacheList()
       {
           return m_cacheInfos;
       }

       /// &lt;summary&gt;
       /// Returns all comments related to a cache.
       /// &lt;/summary&gt;
       /// &lt;param name="cacheId"&gt;&lt;/param&gt;
       /// &lt;returns&gt;&lt;/returns&gt;
       [WebMethod]
       public List&lt;Message&gt; GetComments(int cacheId)
       {
           List&lt;Message&gt; comments = new List&lt;Message&gt;();

           CacheInfo cacheInfo = FindCache(cacheId);
           if (cacheInfo != null)
           {
               comments = m_cacheComments[cacheInfo];
           }

           return comments;
       }

       /// &lt;summary&gt;
       /// Sends a contragulations message to the creator
       /// of a cache.
       /// &lt;/summary&gt;
       /// &lt;param name="message"&gt;&lt;/param&gt;
       /// &lt;param name="cacheId"&gt;&lt;/param&gt;
       [WebMethod]
       public void SendMessage(Message message, int cacheId)
       {
           CacheInfo cacheInfo = FindCache(cacheId);

           if (!m_mailboxes.ContainsKey(cacheInfo.creatorName))
           {
               m_mailboxes[cacheInfo.creatorName] = new List&lt;Message&gt;();
           }

           m_mailboxes[cacheInfo.creatorName].Add(message);
       }

       /// &lt;summary&gt;
       /// Returns all messages sent to a player (like
       /// congratulations messages).
       /// &lt;/summary&gt;
       /// &lt;param name="playerName"&gt;&lt;/param&gt;
       /// &lt;returns&gt;&lt;/returns&gt;
       [WebMethod]
       public List&lt;Message&gt; GetMessages(String playerName)
       {
           if (!m_mailboxes.ContainsKey(playerName))
           {
               m_mailboxes[playerName] = new List&lt;Message&gt;();
           }

           return m_mailboxes[playerName];
       }

       /// &lt;summary&gt;
       /// Adds a comment to a cache.
       /// &lt;/summary&gt;
       /// &lt;param name="message"&gt;&lt;/param&gt;
       /// &lt;param name="cacheId"&gt;&lt;/param&gt;
       [WebMethod]
       public void AddComment(Message message, int cacheId)
       {
           CacheInfo cacheInfo = FindCache(cacheId);
           if (cacheInfo != null)
           {
               m_cacheComments[cacheInfo].Add(message);
           }
       }

       private PlayerInfo FindPlayer(string playerName)
       {
           foreach (PlayerInfo info in m_playerInfos)
           {
               if (info.playerName == playerName)
               {
                   return info;
               }
           }

           return null;
       }

       private CacheInfo FindCache(int id)
       {
           foreach (CacheInfo info in m_cacheInfos)
           {
               if (info.id == id)
               {
                   return info;
               }
           }

           return null;
       }
   }
}

我在 IIS 管理器的“預設網站”上創建了一個虛擬文件夾。我使用 IIS 7.0 和 Windows Server 2008。

我看了十分之一的論壇,他們都這麼說:

  1. IIS 7.0 可能有問題
  2. .asmx 文件中類屬性的命名空間不好(在我的情況下是這樣)
  3. 如果包含 Web 服務的類名是 Service,那麼它可能不起作用(一個錯誤)
  4. 文件的建構動作.asmx必須是Content(它是)。
  5. 文件的建構動作.asmx.cs必須是編譯(它是)。
  6. 程式碼必須在App_Code“虛擬目錄”的目錄中,並且.asmx文件必須在 CodeBehind 屬性中包含正確的文件(我嘗試過,但沒有用)。

這是目錄結構

- App_Data
- bin
  - GeocachingServer.asmx
  - GeocachingServer.asmx.cs
  - GeocachingServer.dll
  - GeocachingServer.pdb
- obj
  - Debug
      - Refactor
      - TempPE
      - GeocachingServer.dll
      - GeocachingServer.pdb
      - Server.csproj.FileListAbsolute.txt
- Properties
  - AssemblyInfo.cs
- Example09ServiceWeb.Publish.xml
- GeocachingServer.asmx
- GeocachingServer.asmx.cs
- Server.csproj
- Server.csproj.user
- Server.Publish.xml
- Web.config
- x.html (if I ask this file when specifying the URL, it works)

這是我的 web.config 文件:

&lt;?xml version="1.0"?&gt;
&lt;configuration&gt;
   &lt;configSections&gt;
       &lt;sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"&gt;
           &lt;sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"&gt;
               &lt;section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/&gt;
               &lt;sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"&gt;
                   &lt;section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/&gt;
                   &lt;section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/&gt;
                   &lt;section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/&gt;
                   &lt;section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/&gt;&lt;/sectionGroup&gt;&lt;/sectionGroup&gt;&lt;/sectionGroup&gt;&lt;/configSections&gt;&lt;appSettings/&gt;
   &lt;connectionStrings/&gt;
   &lt;system.web&gt;
       &lt;!-- 
           Définissez compilation debug="true" pour insérer des symboles 
           de débogage dans la page compilée. Comme ceci 
           affecte les performances, définissez cette valeur à true uniquement 
           lors du développement.
       --&gt;
       &lt;customErrors mode="Off"/&gt;
       &lt;compilation debug="true"&gt;
           &lt;assemblies&gt;
               &lt;add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/&gt;
               &lt;add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&gt;
               &lt;add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/&gt;
               &lt;add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/&gt;&lt;/assemblies&gt;&lt;/compilation&gt;
       &lt;!--
           La section &lt;authentication&gt; permet la configuration 
           du mode d'authentification de sécurité utilisé par 
           ASP.NET pour identifier un utilisateur entrant. 
       --&gt;
       &lt;!--authentication mode="Windows"/&gt;
   --&gt;
       &lt;!--
           La section &lt;customErrors&gt; permet de configurer 
           les actions à exécuter si/quand une erreur non gérée se produit 
           lors de l'exécution d'une demande. Plus précisément, 
           elle permet aux développeurs de configurer les pages d'erreur html 
           pour qu'elles s'affichent à la place d'une trace de la pile d'erreur.

       &lt;customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"&gt;
           &lt;error statusCode="403" redirect="NoAccess.htm" /&gt;
           &lt;error statusCode="404" redirect="FileNotFound.htm" /&gt;
       &lt;/customErrors&gt;
       --&gt;
       &lt;pages&gt;
           &lt;controls&gt;
               &lt;add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&gt;
               &lt;add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&gt;&lt;/controls&gt;&lt;/pages&gt;
       &lt;httpHandlers&gt;
           &lt;remove verb="*" path="*.asmx"/&gt;
           &lt;add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&gt;
           &lt;add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&gt;
           &lt;add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&gt;&lt;/httpHandlers&gt;
       &lt;httpModules&gt;
           &lt;add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&gt;&lt;/httpModules&gt;&lt;/system.web&gt;
   &lt;system.codedom&gt;
           &lt;compilers&gt;
               &lt;compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4"&gt;
                   &lt;providerOption name="CompilerVersion" value="v3.5"/&gt;
                   &lt;providerOption name="WarnAsError" value="false"/&gt;&lt;/compiler&gt;&lt;/compilers&gt;&lt;/system.codedom&gt;
   &lt;!-- 
       La section system.webServer est requise pour exécuter ASP.NET AJAX sur Internet
       Information Services 7.0.  Elle n'est pas nécessaire pour les versions précédentes d'IIS.
   --&gt;
   &lt;system.webServer&gt;
           &lt;validation validateIntegratedModeConfiguration="false"/&gt;
       &lt;modules&gt;
           &lt;remove name="ScriptModule"/&gt;
           &lt;add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&gt;&lt;/modules&gt;
       &lt;handlers&gt;
           &lt;remove name="WebServiceHandlerFactory-Integrated"/&gt;
           &lt;remove name="ScriptHandlerFactory"/&gt;
           &lt;remove name="ScriptHandlerFactoryAppServices"/&gt;
           &lt;remove name="ScriptResource"/&gt;
           &lt;add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&gt;
           &lt;add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&gt;
           &lt;add name="ScriptResource" verb="GET,HEAD" path="ScriptResource.axd" preCondition="integratedMode" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/&gt;&lt;/handlers&gt;&lt;/system.webServer&gt;
   &lt;startup&gt;&lt;supportedRuntime version="v2.0.50727"/&gt;&lt;/startup&gt;
   &lt;runtime&gt;
       &lt;assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"&gt;
           &lt;dependentAssembly&gt;
               &lt;assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/&gt;
               &lt;bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/&gt;&lt;/dependentAssembly&gt;
           &lt;dependentAssembly&gt;
               &lt;assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/&gt;
               &lt;bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/&gt;&lt;/dependentAssembly&gt;&lt;/assemblyBinding&gt;&lt;/runtime&gt;&lt;/configuration&gt;

經過六個小時的調試,我沒有找到解決問題的方法。請幫忙!

我找到了一種解決方法:將 .asmx.cs 程式碼放在 .asmx 文件的第一行之後,並刪除 .asmx 文件第一行的 CodeBehind 屬性。

如果您使用的是Web Site項目,則應將程式碼隱藏GeocachingServer.asmx.cs~/App_Code/目錄中並指向 .asmx 中的該路徑

如果這不起作用,您忘記右鍵點擊您的虛擬目錄並選擇Convert to Application.

儘管您應該首先在該文件夾上創建一個應用程序,而不是使其成為虛擬目錄。您應該Add Application在創建它時點擊。

IIS7 轉換為應用程序

引用自:https://stackoverflow.com/questions/4239131