我想在WCF上返回一个匿名类型。这可能吗?
答案 0 :(得分:4)
你不能使用匿名类型,但也许你在谈论WCF和无类型消息?
WCF中有一个选项可以只定义类型为Message
的参数(可能还有相同类型的返回值)。这只是转到WCF的原始消息(并从它返回)。
我找不到很多好的信息 - 在MSDN上有一些文档,但到目前为止我见过的最好的是Kurt Claeys的博文WCF : Untyped messages on WCF operations。
我不建议使用这种方法 - 直接自己处理消息内容是一项更加繁琐的工作,而这正是WCF试图让我们免除的 - 但如果你绝对必须调整你的每一条消息 - 这似乎是要走的路。
马克
答案 1 :(得分:3)
您无法从任何方法返回匿名类型,是吗?那你为什么能从WCF返回呢?
答案 2 :(得分:1)
好的,我明白了。但是如果我定义的话 一个类型 - MyObj - 为此目的和 标记其成员IsRequired = false,如何 我可以创建+发送实例 MyObj只有一部分 成员?这可能吗?
查看[DataMember(EmitDefaultValue=false)]
答案 3 :(得分:1)
看起来你不能使用XML Serializer,因为有一些关于无参数构造函数的抱怨,但如果你正在服务于dave Ward指示的ajax客户端,它适用于json序列化器。
答案 4 :(得分:0)
不,不是。您必须提前定义类型。
答案 5 :(得分:0)
您肯定可以返回匿名类型。这有效,例如:
public object GetLatestPost()
{
XDocument feedXML = XDocument.Load("http://feeds.encosia.com/Encosia");
var posts = from feed in feedXML.Descendants("item")
select new
{
Title = feed.Element("title").Value,
Link = feed.Element("link").Value,
Description = feed.Element("description").Value
};
return posts.First();
}
如果您将该方法称为ASMX ScriptService的WebMethod,您将从中获取此JSON:
{"d":
{"Title":"Using an iPhone with the Visual Studio development server",
"Link":"http://feeds.encosia.com/~r/Encosia/~3/vQoxmC6lOYk/",
"Description":" Developing iPhone-optimized portions of an ASP.NET ..."}}
您可以使用IEnumerable的返回类型来返回匿名类型的集合。
答案 6 :(得分:0)
您可以使用ExpandoObject。在DTO中将属性定义为ExpandoObject时,客户端将生成为Dictionary:
合同DTO
public class TaskDTO
{
public string Type { get; set; }
public ExpandoObject Args { get; set; }
public string Id { get; set; }
public TaskDTO SuccessTask { get; set; }
public TaskDTO FailTask { get; set; }
public bool IsFinal { get; set; }
}
客户端
using (var client = new JobServiceClient())
{
var task = new TaskDTO
{
Id = Guid.NewGuid().ToString(),
Type = "SendEmailTask",
IsFinal = true
};
dynamic args = new ExpandoObject();
args.To = "who@mail.com";
args.Title = "test job service";
args.Content = "test job service";
task.Args = ((IDictionary<string, object>)args).ToDictionary(i => i.Key, i => i.Value);
client.Execute(task);
}
服务
dynamic args = dto.Args;