【问题标题】:Why am I having an ambiguous type error when calling a WebMethod on ASP.NET Web Application?为什么在 ASP.NET Web 应用程序上调用 WebMethod 时出现模棱两可的类型错误?
【发布时间】:2011-07-07 11:23:39
【问题描述】:

发送到浏览器的消息如下:

My.API.Class 类型不明确:它可能来自程序集“[在 Temporary ASP.NET 文件上]”或程序集“[在 bin 文件夹上]”

在调试 Web App 时会出现问题,特别是在向 WebService 的 WebMethod 发出请求时。

项目编译得恰到好处。如果我发布了 Web 应用程序,它会在 bin 文件夹上生成 My.Website.dll。它工作正常。

asmx 文件位于应用程序的根目录。 CodeBehind 文件位于 App_Code 上,并标记为编译生成 My.Website.dll。

我应该错过了一些非常重要的东西。

我发现有人遇到同样的问题,可能是相关原因。 Check it out。这个人暴露问题的方式有点相似,但是当他谈到代理类和我不使用的共享 dll 时,我开始迷失了。

感谢任何帮助。

【问题讨论】:

    标签: asp.net web-services debugging web-applications


    【解决方案1】:

    调试此类问题的最佳方法是使用 Visual Studio 的“调试”->“窗口”菜单中的“模块”窗口。它将向您显示所有已加载的程序集。特别是,您希望多次在模块列表中查找 My.API.Class。按加载顺序对列表进行排序,并查看它之前的 dll(通常是负责加载程序集的那个)。最可能的原因是您的其中一个引用也引用了 My.API 程序集,但引用的程序集版本与您的站点不同。

    【讨论】:

    • My.API 程序集位于 My.Website.dll 上。我已将问题的错误消息更改为将“临时 ASP.NET 文件”文件夹指向引用 My.API.Class 的程序集之一的位置。这会以任何方式改变问题吗?我看不出你的调试问题的建议有什么帮助。
    • 是的,这有很大不同。临时 asp.net 文件中的 dll 意味着它是通过编译您的网站代码自动生成的。我会尝试删除该文件夹的内容,看看是否可以清除它。如果这不起作用,您需要找出为什么在您的 bin 目录和 asp.net 临时文件目录中都获得了一个程序集。我首先使用 Ildasm 或反射工具来查看每个程序集并查看内容。
    • 我确实删除了所有临时文件和文件夹。然后尝试使用 ildasm 并意识到这两个程序集编译了几乎相同的引用。这样我就找到了解决问题的方法。
    • 谢谢,您的评论帮助我发现客户端包含的第二个程序集同时被加载并导致不明确的引用(结果程序集相同但名称不同,具体取决于它们的位置应该活着。)
    【解决方案2】:

    根据this,App_Code 文件夹只能用于网站项目。这就是 asmx 的 CodeBehind 也在运行时编译的原因。

    最初的问题是基于 Web 应用程序提出的。但我没有指定这个 Web App。已从网站项目手动更改。

    为了解决我的问题,我做了以下操作:

    1. 将项目转换为 Web 应用程序。这将使 App_Code 重命名为 Old_App_Code。
    2. 将所有 Old_App_Code 资源移至类库,然后将此库引用到 Web 应用程序中。

    @Tony:谢谢你指导我。

    【讨论】:

    • 我将旧的 VS2005 Web 服务升级到 VS2010。在 VS2005 中,我有一个 App_Code 文件夹。所以我最终在VS2010中遇到了这个问题。将代码文件移动到根目录为我解决了这个问题。谢谢。
    • 当这些 Old_App_Code 资源是 @helpers 时,如何将它们移动到类库中(在我的例子中,我将它们存储在 Utils.cshtml 中)?
    【解决方案3】:

    您也可以通过在属性“Class” ex 的末尾添加程序集名称来修复它:

    代替

    <%@ WebService  Language="C#" CodeBehind="~/App_Code/WebService.cs"  Class="WebService" %>
    

    使用

    <%@ WebService  Language="C#"  Class="WebService, YourProjectName" %>
    

    当您制作网站时,程序集名称是随机的,以“App_Code”开头,但当您将其更改为 Web 应用程序时,程序集名称将为“YourProjectName”。

    这个问题只存在于开发环境中,所以我想我的解决方案更好,因为您不必重命名您的文件夹(这可能会导致您的源代码管理出现问题)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 2013-01-18
      相关资源
      最近更新 更多