【问题标题】:ASMX Webservice: 'anonymous types' errorASMX Webservice:“匿名类型”错误
【发布时间】:2012-01-10 09:31:11
【问题描述】:

我正在现有的 .Net 3.5 网站中创建一个 asmx 网络服务。我想根据一个键返回一个帖子。我想将帖子作为匿名类型返回,但它给了我以下错误:

无法使用功能“匿名类型”,因为它不是 ISO-2 C# 语言规范。

这是问题的屏幕转储:

有什么办法解决这个问题吗?

注意:我的 asmx 是独立的。它包含代码,后面没有.cs。

【问题讨论】:

  • 看到这个答案:这能解决问题吗? stackoverflow.com/a/3314483/23354 - 注意:这只会让编译器开心;我同意 Fredrik/Steve/Paul/Lloyd 的观点,即这不是一个好方法
  • 返回一个具体类型,new ConcreteType() { PostId = yada; }

标签: c# web-services asmx


【解决方案1】:

第一个问题是您返回的是object

作为 WebService 生成定义(WSDL),您如何期望在不知道实际类型的情况下生成定义?

你应该引入一个 DTO 风格的类(没有逻辑,只有数据),比如:

[Serializable]
public class Post
{
    public int PostID {get;set;}
    public int ThreadID { get; set; }
    public string Subject { get; set; }
    public string Body { get; set;}
}

并更改您的定义以返回此类。

代码量很轻。

[编辑] 上述解决方案将解决您的问题。但是,问题的确切来源是这个:

当您在 .cs 文件中工作时,使用的编译器是项目目标框架的编译器(此处为 3.5)。编译发生在编码时。

当您在 .asmx 文件中工作时,将在加载 asp.net 应用程序时进行编译。 asp.net运行时的编译器中使用的编译器,对于.Net 3.5来说,是2.0运行时的编译器。这是因为 Framework 3.5 只是一组新的类,但 CLR 仍然在 V2 中(随 V4 更改)。在这种情况下,即使你的项目是 3.5,也只有 .cs 文件中的代码可以使用 3.5 语言特性。 aspx 和 asmx 文件中的所有代码都只能使用 V2 语言功能。

【讨论】:

  • 啊,这就解释了...... POCO 对象它是。
【解决方案2】:

这是网站还是网络应用程序?

您可能在项目中设置了较旧的 langversion。

看看这个: http://msdn.microsoft.com/en-us/library/f4ckecs0(v=vs.110).aspx

如果是网站,请检查编译器部分的 web.config 中设置的内容。 如果有属性:

<compiler language="c#;cs;csharp" extension=".cs" compilerOptions="/langversion:ISO-2"  ... >

去掉langversion参数,或者改成

compilerOptions="/langversion:3"

【讨论】:

  • 好吧,我决定使用 POCO 对象,因为这里的人们说服我这是一种更好的方法:P
  • 另外我没有“.cs”文件,但有一个“.asmx”文件。
  • 文件扩展名不相关。在您的 asmx 文件中,您有标题,您可以在其中指定 c# 语言。 POCO 是 Web 服务的更好解决方案,但您的问题是关于编译器异常。
【解决方案3】:

我想你有你的答案。

如果我是你,我会简单地创建一个 POCO(普通的旧 C# 对象)来模拟你想要传递的匿名结构。

【讨论】:

    【解决方案4】:

    WebService 技术基于称为 WSDL 的 xml 文档,其中包含对服务的功能、参数和返回类型的描述。您的 Web 服务的客户可以从本文档中了解您对服务的期望。如果不指定返回类型,则无法创建文档。您必须在函数中返回特定类的对象。

    【讨论】:

    • 我在 (.Net 4) 之前使用了带有 [WebMethod] 方法的匿名对象。它工作得很好(将它们转换为 JSON)。
    • 可以做到,但我认为这不是 web 服务应该做的。知道您可以得到什么响应并能够从 wsdl 自动生成类是 web 服务所具有的优势之一,例如 http/rest 或纯套接字通信。如果你不想那样,为什么还要麻烦和使用 web 服务?只需创建一些 http 站点并接受发布请求。
    猜你喜欢
    • 2017-11-03
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多