开发者

"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"/></httpModu开发者_如何学Cles></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!


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.

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


I have found a workaround solution: put the .asmx.cs code after the first line of the .asmx file and remove the CodeBehind attribute on the first line of the .asmx file.


My problem was that I changed the Namespace I was using. The asmx.cs had the Namespace change, however the old value was still in the Class property of the markup. You have to right-click the asmx file and select "View Markup" in order to see the markup and make the necessary changes.


The solution for us was to delete the .asmx and .asmx.cs files, SVN update to get them back, and rebuild.

We didn't bother to look any further because it worked, but here are a couple of theories:
- bad file encoding
- VS2010 caching of old files and not properly reloading the new ones.

Anyway, you've got another thing to try.


We solved this problem by uploading the Web.csproj file to our continuous integration server. It includes the references to \api* so service was never being built.


Another reason can be that your code behind (.cs) file has class name different from which specified in .asmx file. Open .asxm file with XML editor to see what class name specified in it.


The solution to this error in my case was that the project url in the project properties had a typo and was not publishing where expected.


Just in case it helps anyone else, for me it was a missing Microsoft.Web.Services3.dll file that caused it. Theirs a nuget package https://www.nuget.org/packages/Microsoft.Web.Services3

Was fine on a 2008R2 server but on a 2019 it failed guess something was installed on the older server which added that dll to the GAC.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜