.net 访问 IIS 7.0 上的 .asmx 页面时出现“无法创建类型 XXXX”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4239131/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
"Could not create type XXXX" when accessing a .asmx page on IIS 7.0
提问by GDICommander
I have this error message when I'm trying to access a .asmx file on my Web browser. The message is the following:
当我尝试在 Web 浏览器上访问 .asmx 文件时收到此错误消息。消息如下:
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" %>
说明:解析服务此请求所需的资源期间发生错误。请查看以下特定解析错误详细信息并适当修改您的源文件。
解析器错误消息:无法创建类型“GeocachingServerNS.GeocachingServer”。
源错误:
第 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.
我在 IIS 管理器的“默认网站”上创建了一个虚拟文件夹。我使用 IIS 7.0 和 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
.asmxfile must beContent(it is).The build action of the
.asmx.csfile must be Compile (it is).The code must be in an
App_Codedirectory in the "virtual directory" and the.asmxfile must include the correct file in the CodeBehind attribute (I have tried, but it didn't work).
IIS 7.0 可能有问题
.asmx 文件中类属性的命名空间不好(在我的情况下,它是)
如果包含 Web 服务的类名是 Service,那么它可能不起作用(一个错误)
.asmx文件的构建操作必须是Content(它是)。.asmx.cs文件的构建操作必须是 Compile(它是)。代码必须位于
App_Code“虚拟目录”中的目录中,并且该.asmx文件必须在 CodeBehind 属性中包含正确的文件(我已经尝试过,但没有奏效)。
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:
这是我的 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>
After six hours of debugging, I didn't found the solution to my problem. Please help!
经过六个小时的调试,我没有找到解决问题的方法。请帮忙!
采纳答案by GDICommander
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.
我找到了一个变通的解决方案:将 .asmx.cs 代码放在 .asmx 文件的第一行之后,并删除 .asmx 文件第一行上的 CodeBehind 属性。
回答by Amit Naidu
If you are using a Web Siteproject, you should be putting your codebehind GeocachingServer.asmx.csin the ~/App_Code/directory and pointing to that path in the .asmx
如果您正在使用Web Site项目,则应该将代码隐藏GeocachingServer.asmx.cs在~/App_Code/目录中并指向 .asmx 中的该路径
If that didn't work, you forgot to right click on your virtual directory and pick Convert to Application.
如果这不起作用,您忘记右键单击您的虚拟目录并选择Convert to Application.
Although you should have created an applicationon that folder in the first place, instead of making it a virtual Directory. You should click Add Applicationwhen creating it.
尽管您应该首先在该文件夹上创建一个应用程序,而不是将其设为虚拟目录。您应该Add Application在创建它时单击。


回答by RoastBeast
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.
我的问题是我更改了我使用的命名空间。asmx.cs 更改了命名空间,但旧值仍在标记的 Class 属性中。您必须右键单击 asmx 文件并选择“查看标记”才能查看标记并进行必要的更改。
回答by lesma
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
以防万一它对其他人有帮助,对我来说,它是导致它丢失的 Microsoft.Web.Services3.dll 文件。他们的 nuget 包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.
在 2008R2 服务器上很好,但在 2019 年它失败了猜测旧服务器上安装了某些东西,该服务器将该 dll 添加到 GAC。
回答by Ryan
The solution for us was to delete the .asmx and .asmx.cs files, SVN update to get them back, and rebuild.
我们的解决方案是删除 .asmx 和 .asmx.cs 文件,更新 SVN 以将它们取回,然后重建。
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.
我们没有费心再看,因为它有效,但这里有一些理论:
- 错误的文件编码
- VS2010 缓存旧文件并且没有正确重新加载新文件。
Anyway, you've got another thing to try.
不管怎样,你还有另一件事要尝试。
回答by Tyrone Moodley
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.
我们通过将 Web.csproj 文件上传到我们的持续集成服务器解决了这个问题。它包括对 \api* 的引用,因此从未构建服务。
回答by Vil
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.
另一个原因可能是您的代码隐藏 (.cs) 文件具有与 .asmx 文件中指定的不同的类名。使用 XML 编辑器打开 .asxm 文件以查看其中指定的类名。
回答by Richard
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.
在我的情况下,此错误的解决方案是项目属性中的项目 url 有一个错字,并且没有在预期的地方发布。

