"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:
There may be something with IIS 7.0
The namespace of the class attribute in the .asmx file is not good (in my case, it is)
If the class name containing the Web service is Service, then it may not work (a bug)
The build action of the .asmx
file must be Content
(it is).
The build action of the .asmx.cs
file must be Compile (it is).
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!
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.
我找到了一个解决方法:将.asmx.cs代码放在.asmx文件的第一行之后,并在.asmx文件的第一行中删除CodeBehind属性。
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.
链接地址: http://www.djcxy.com/p/64318.html上一篇: 类型或名称空间名称不存在