Dot-Net
在 IIS 7.0 上訪問 .asmx 頁面時出現“無法創建類型 XXXX”
當我嘗試在我的 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<CacheInfo> m_cacheInfos = new List<CacheInfo>(); public static List<PlayerInfo> m_playerInfos = new List<PlayerInfo>(); public static Dictionary<CacheInfo, List<Message>> m_cacheComments = new Dictionary<CacheInfo, List<Message>>(); public static Dictionary<string, List<Message>> m_mailboxes = new Dictionary<string, List<Message>>(); /// <summary> /// Registers a new cache into the geocaching server. /// The cache will be visible to players. /// </summary> /// <param name="cacheName"></param> /// <param name="creatorName"></param> /// <param name="position"></param> /// <param name="hint"></param> [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<Message>(); ++m_idCounter; } /// <summary> /// Sends (updates) the position of a player to the geocaching server. /// </summary> /// <param name="position"></param> /// <param name="playerName"></param> [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; } } /// <summary> /// Removes a player from the geocaching game. /// </summary> /// <param name="playerName"></param> [WebMethod] public void Disconnect(string playerName) { PlayerInfo playerInfo = FindPlayer(playerName); m_playerInfos.Remove(playerInfo); //Fonctionne aussi avec null. } /// <summary> /// Returns positions of players nearby. /// </summary> /// <param name="playerName">The player that requests the positions.</param> /// <returns></returns> [WebMethod] public List<PlayerInfo> GetPlayerPositions(String playerName) { //TODO: Retourner la position des joueurs qui sont près du joueur... return m_playerInfos; } /// <summary> /// Returns the list of all caches that exists in the server. /// </summary> /// <returns></returns> [WebMethod] public List<CacheInfo> GetCacheList() { return m_cacheInfos; } /// <summary> /// Returns all comments related to a cache. /// </summary> /// <param name="cacheId"></param> /// <returns></returns> [WebMethod] public List<Message> GetComments(int cacheId) { List<Message> comments = new List<Message>(); CacheInfo cacheInfo = FindCache(cacheId); if (cacheInfo != null) { comments = m_cacheComments[cacheInfo]; } return comments; } /// <summary> /// Sends a contragulations message to the creator /// of a cache. /// </summary> /// <param name="message"></param> /// <param name="cacheId"></param> [WebMethod] public void SendMessage(Message message, int cacheId) { CacheInfo cacheInfo = FindCache(cacheId); if (!m_mailboxes.ContainsKey(cacheInfo.creatorName)) { m_mailboxes[cacheInfo.creatorName] = new List<Message>(); } m_mailboxes[cacheInfo.creatorName].Add(message); } /// <summary> /// Returns all messages sent to a player (like /// congratulations messages). /// </summary> /// <param name="playerName"></param> /// <returns></returns> [WebMethod] public List<Message> GetMessages(String playerName) { if (!m_mailboxes.ContainsKey(playerName)) { m_mailboxes[playerName] = new List<Message>(); } return m_mailboxes[playerName]; } /// <summary> /// Adds a comment to a cache. /// </summary> /// <param name="message"></param> /// <param name="cacheId"></param> [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。
我看了十分之一的論壇,他們都這麼說:
- IIS 7.0 可能有問題
- .asmx 文件中類屬性的命名空間不好(在我的情況下是這樣)
- 如果包含 Web 服務的類名是 Service,那麼它可能不起作用(一個錯誤)
- 文件的建構動作
.asmx必須是Content(它是)。- 文件的建構動作
.asmx.cs必須是編譯(它是)。- 程式碼必須在
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 文件:
<?xml version="1.0"?> <configuration> <configSections> <sectionGroup name="system.web.extensions" type="System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <sectionGroup name="scripting" type="System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <section name="scriptResourceHandler" type="System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> <sectionGroup name="webServices" type="System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/> <section name="profileService" type="System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> <section name="authenticationService" type="System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/> <section name="roleService" type="System.Web.Configuration.ScriptingRoleServiceSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="MachineToApplication"/></sectionGroup></sectionGroup></sectionGroup></configSections><appSettings/> <connectionStrings/> <system.web> <!-- 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. --> <customErrors mode="Off"/> <compilation debug="true"> <assemblies> <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/> <add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/></assemblies></compilation> <!-- La section <authentication> permet la configuration du mode d'authentification de sécurité utilisé par ASP.NET pour identifier un utilisateur entrant. --> <!--authentication mode="Windows"/> --> <!-- La section <customErrors> 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. <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm"> <error statusCode="403" redirect="NoAccess.htm" /> <error statusCode="404" redirect="FileNotFound.htm" /> </customErrors> --> <pages> <controls> <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/></controls></pages> <httpHandlers> <remove verb="*" path="*.asmx"/> <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <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"/> <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"/></httpHandlers> <httpModules> <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/></httpModules></system.web> <system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4"> <providerOption name="CompilerVersion" value="v3.5"/> <providerOption name="WarnAsError" value="false"/></compiler></compilers></system.codedom> <!-- 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. --> <system.webServer> <validation validateIntegratedModeConfiguration="false"/> <modules> <remove name="ScriptModule"/> <add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/></modules> <handlers> <remove name="WebServiceHandlerFactory-Integrated"/> <remove name="ScriptHandlerFactory"/> <remove name="ScriptHandlerFactoryAppServices"/> <remove name="ScriptResource"/> <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"/> <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"/> <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"/></handlers></system.webServer> <startup><supportedRuntime version="v2.0.50727"/></startup> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.Extensions" publicKeyToken="31bf3856ad364e35"/> <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/></dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Web.Extensions.Design" publicKeyToken="31bf3856ad364e35"/> <bindingRedirect oldVersion="1.0.0.0-1.1.0.0" newVersion="3.5.0.0"/></dependentAssembly></assemblyBinding></runtime></configuration>經過六個小時的調試,我沒有找到解決問題的方法。請幫忙!
我找到了一種解決方法:將 .asmx.cs 程式碼放在 .asmx 文件的第一行之後,並刪除 .asmx 文件第一行的 CodeBehind 屬性。
如果您使用的是
Web Site項目,則應將程式碼隱藏GeocachingServer.asmx.cs在~/App_Code/目錄中並指向 .asmx 中的該路徑如果這不起作用,您忘記右鍵點擊您的虛擬目錄並選擇
Convert to Application.儘管您應該首先在該文件夾上創建一個應用程序,而不是使其成為虛擬目錄。您應該
Add Application在創建它時點擊。
