Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"Could not create type XXXX" when accessing a .asmx page on IIS 7.0

I have this error message when I'm trying to access a .asmx file on my Web browser. The message is the following:

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.

Parser Error Message: Could not create type 'GeocachingServerNS.GeocachingServer'.

Source Error:

Line 1: <%@ WebService Language="C#" CodeBehind="GeocachingServer.asmx.cs" Class="GeocachingServerNS.GeocachingServer" %>

This is my 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<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;
        }
    }
}

I have created a virtual folder on "Default Web Site" on IIS Manager. I use IIS 7.0 and Windows Server 2008.

I have looked at tenths of forums and they all say these things:

  1. There may be something with IIS 7.0

  2. The namespace of the class attribute in the .asmx file is not good (in my case, it is)

  3. If the class name containing the Web service is Service, then it may not work (a bug)

  4. The build action of the .asmx file must be Content (it is).

  5. The build action of the .asmx.cs file must be Compile (it is).

  6. The code must be in an App_Code directory in the "virtual directory" and the .asmx file must include the correct file in the CodeBehind attribute (I have tried, but it didn't work).

This is the directory structure

- 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)

This is my web.config file:

<?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>

After six hours of debugging, I didn't found the solution to my problem. Please help!

like image 512
GDICommander Avatar asked Nov 21 '10 17:11

GDICommander


1 Answers

If you are using a Web Site project, you should be putting your codebehind GeocachingServer.asmx.cs in the ~/App_Code/ directory and pointing to that path in the .asmx

If that didn't work, you forgot to right click on your virtual directory and pick Convert to Application.

Although you should have created an application on that folder in the first place, instead of making it a virtual Directory. You should click Add Application when creating it.

IIS7 Convert to application

like image 140
Amit Naidu Avatar answered Oct 11 '22 18:10

Amit Naidu