«Не удалось создать тип XXXX» при доступе к странице .asmx в IIS 7.0 - PullRequest
16 голосов
/ 21 ноября 2010

У меня появляется это сообщение об ошибке, когда я пытаюсь получить доступ к файлу .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 Manager. Я использую IIS 7.0 и Windows Server 2008.

Я посмотрел десятки форумов, и все они говорят следующее:

  1. Может быть что-то с IIS 7.0

  2. Пространство имен атрибута class в файле .asmx не подходит (в моем случае это так)

  3. Если имя класса, содержащего веб-сервис, - Service, оно может не работать (ошибка)

  4. Действие по сборке файла .asmx должно быть Content (оно есть).

  5. Действие сборки файла .asmx.cs должно быть Compile (оно есть).

  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:

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

После шести часов отладки я не нашел решения своей проблемы. Пожалуйста, помогите!

Ответы [ 7 ]

12 голосов
/ 05 апреля 2013

Если вы используете проект Web Site, вы должны поместить свой код GeocachingServer.asmx.cs в каталог ~/App_Code/ и указать этот путь в .asmx

Если это не сработало, вы забыли щелкнуть правой кнопкой мыши по вашему виртуальному каталогу и выбрать Convert to Application.

Хотя вы должны были создать приложение в этой папке, а не делать его виртуальным каталогом. Вы должны нажать Add Application при его создании.

IIS7 Convert to application

10 голосов
/ 24 ноября 2010

Я нашел обходное решение: поместите код .asmx.cs после первой строки файла .asmx и удалите атрибут CodeBehind в первой строке файла .asmx.

3 голосов
/ 28 июня 2017

Моя проблема заключалась в том, что я изменил пространство имен, которое использовал.В asmx.cs было изменено пространство имен, однако старое значение все еще оставалось в свойстве Class разметки.Вы должны щелкнуть правой кнопкой мыши по файлу asmx и выбрать «Просмотреть разметку», чтобы увидеть разметку и внести необходимые изменения.

0 голосов
/ 17 июня 2015

Решением этой ошибки в моем случае было то, что URL проекта в свойствах проекта имел опечатку и не публиковался там, где ожидалось.

0 голосов
/ 08 мая 2015

Другая причина может заключаться в том, что ваш файл кода (.cs) имеет имя класса, отличное от указанного в файле .asmx. Откройте файл .asxm в редакторе XML, чтобы увидеть, какое имя класса указано в нем.

0 голосов
/ 05 марта 2014

Мы решили эту проблему, загрузив файл Web.csproj на наш сервер непрерывной интеграции. Он включает ссылки на \ api *, поэтому служба никогда не создавалась.

0 голосов
/ 20 декабря 2012

Решением для нас было удаление файлов .asmx и .asmx.cs, обновление SVN для их возврата и перестройка.

Мы не удосужились посмотреть дальше, потому что это сработало, ноВот пара теорий:
- неправильная кодировка файлов
- VS2010 кэширует старые файлы и неправильно перезагружает новые.

В любом случае, вам нужно попробовать еще одну вещь.

...