title: "Could not create type XXXX" when accessing a .asmx page on IIS 7.0
body: <p>I have this error message when I'm trying to access a .asmx file on my Web browser. The message is the following:</p>
  
  <blockquote>
    <p>Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately. </p>
    
    <p>Parser Error Message: Could not create type 'GeocachingServerNS.GeocachingServer'.</p>
    
    <p>Source Error: </p>
    
    <p>Line 1:  &lt;%@ WebService Language="C#" CodeBehind="GeocachingServer.asmx.cs" Class="GeocachingServerNS.GeocachingServer" %>  </p>
  </blockquote>
  
  <p>This is my code:</p>
  
  <pre><code>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;
          }
      }
  }
  </code></pre>
  
  <p>I have created a virtual folder on "Default Web Site" on IIS Manager. I use IIS 7.0 and Windows Server 2008.</p>
  
  <p>I have looked at tenths of forums and they all say these things:</p>
  
  <ol>
  <li><p>There may be something with IIS 7.0</p></li>
  <li><p>The namespace of the class attribute in the .asmx file is not good (in my case, it is)</p></li>
  <li><p>If the class name containing the Web service is Service, then it may not work (a bug)</p></li>
  <li><p>The build action of the <code>.asmx</code> file must be <code>Content</code> (it is).</p></li>
  <li><p>The build action of the <code>.asmx.cs</code> file must be Compile (it is).</p></li>
  <li><p>The code must be in an <code>App_Code</code> directory in the "virtual directory" and the <code>.asmx</code> file must include the correct file in the CodeBehind attribute (I have tried, but it didn't work).</p></li>
  </ol>
  
  <p>This is the directory structure</p>
  
  <pre><code>- 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)
  </code></pre>
  
  <p>This is my web.config file:</p>
  
  <pre><code>&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;
  </code></pre>
  
  <p></p>
  
  <p>After six hours of debugging, I didn't found the solution to my problem. Please help!</p>