2010-11-21 14 views
13

Tengo este mensaje de error cuando intento acceder a un archivo .asmx en mi navegador web. El mensaje es el siguiente:"No se pudo crear el tipo XXXX" al acceder a una página .asmx en IIS 7.0

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" %>

Este es mi código:

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; 
     } 
    } 
} 

He creado una carpeta virtual en "Sitio Web predeterminado" en el Administrador de IIS. Yo uso de IIS 7.0 y Windows Server 2008.

He mirado en décimas de foros y todos dicen estas cosas:

  1. Puede haber algo con IIS 7.0

  2. El espacio de nombres de la atributo de clase en el archivo .asmx no es bueno (en mi caso, es)

  3. Si el nombre de la clase que contiene el servicio web es el servicio, entonces puede que no funcione (un insecto)

  4. La acción de compilación del archivo .asmx debe ser Content (es).

  5. La acción de compilación del archivo .asmx.cs debe ser Compilación (es).

  6. El código debe estar en un directorio App_Code en el "directorio virtual" y el archivo .asmx debe incluir el archivo correcto en el atributo CodeBehind (he intentado, pero no funcionó).

Esta es la estructura de directorios

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

Este es mi archivo 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> 

Después de seis horas de depuración, no he encontrado el solución a mi problema. ¡Por favor ayuda!

+2

Puede publicar la estructura de directorios de esta aplicación web tal como aparece en el servidor, incluyendo (especialmente) la ubicación completa del archivo ASMX y los contenidos y ubicaciones de todos los directorios denominados '/ bin' –

+0

@GDICommander - Just lanzando una idea ... una cosa que podrías probar es cambiar el modo de integración .NET de IIS a Classic ... y ver si eso ayuda a – InSane

+0

@InSame - ¿Y cómo pongo el modo en Classic? (Soy nuevo en IIS) – GDICommander

Respuesta

9

He encontrado una solución alternativa: coloque el código .asmx.cs después de la primera línea del archivo .asmx y elimine el atributo CodeBehind en la primera línea del archivo .asmx.

0

La solución para nosotros fue eliminar los archivos .asmx y .asmx.cs, la actualización de SVN para recuperarlos y volver a generarlos.

No nos molestamos que buscar más porque funcionó, pero aquí son un par de teorías:
- mala codificación de archivos
- VS2010 almacenamiento en caché de archivos antiguos y no volver a cargar adecuadamente los nuevos.

De todos modos, tienes algo más que probar.

12

Si está utilizando un proyecto Web Site, debe colocar su código detrás de GeocachingServer.asmx.cs en el directorio ~/App_Code/ y señalar esa ruta en el.asmx

Si eso no funciona, se olvidó de hacer clic derecho sobre el directorio virtual y recoger Convert to Application.

pesar de que debe haber creado un application en esa carpeta, en primer lugar, en vez de lo que es un directorio virtual. Debe hacer clic en Add Application al crearlo.

IIS7 Convert to application

+0

Esto funcionó para mí, yo tuvo que "convertir a la aplicación". – DJack

0

Hemos resuelto este problema al subir el archivo Web.csproj a nuestro servidor de integración continua. Incluye las referencias a \ api * para que el servicio nunca se haya creado.

0

Otra razón puede ser que su código detrás (Cs) archivo tiene el nombre de clase diferente de la que se especifica en el archivo .asmx. Abra el archivo .asxm con el editor XML para ver qué nombre de clase se especifica en él.

0

La solución a este error en mi caso fue que la URL del proyecto en las propiedades del proyecto tenía un error tipográfico y no estaba publicando en donde se esperaba.

2

Mi problema es que he cambiado el Namespace que estaba usando. Asmx.cs ha cambiado el espacio de nombre, sin embargo, el valor anterior todavía estaba en la propiedad de clase del marcado. Tienes que hacer clic con el botón derecho en el archivo asmx y seleccionar "Ver marca" para ver el marcado y hacer los cambios necesarios.

Cuestiones relacionadas