我正在现有的 .Net 3.5 网站中创建asmx网络服务。我想根据密钥返回一篇帖子。我想将帖子作为匿名类型返回,但它给了我以下错误:
功能'匿名类型'无法使用,因为它不属于 ISO-2 C#语言规范。
以下是问题的屏幕转储:
任何想法如何解决这个问题?
注意:我的asmx独立存在。它包含代码,它背后没有.cs。
答案 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服务的客户端知道本文档对您的服务的期望。如果未指定返回类型,则无法创建文档。您必须在函数中返回特定类的对象。