ASMX Web服务:'匿名类型'错误

时间:2012-01-10 09:31:11

标签: c# web-services asmx

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

  

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

以下是问题的屏幕转储: Feature 'anonymous types' cannot be used because it is not part of the ISO-2 C# language specification

任何想法如何解决这个问题?

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

4 个答案:

答案 0 :(得分:8)

第一个问题是您要返回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语言功能。

答案 1 :(得分: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"

答案 2 :(得分:1)

我想你有答案。

如果我是你,我只需创建一个POCO(普通的旧C#对象),它可以模拟您希望传递的匿名结构。

答案 3 :(得分:1)

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