从Silverlight应用程序中使用从ASMX服务返回的对象。 Class有方法,但ASMX WebMethod的结果不显示对象的方法。
这是我的班级
public class Dog
{
public string Name{get;set;}
public void Bark();
}
这是WebMethod
[WebMethod]
public List<Dog> Findlabrador()
{
blah blah blah
return list_of_labrador;
}
silverlight代码
void LabradorFetchCompleted(object sender, LabradorFetchCompletedEventArgs e)
{
var list_of_labrador = e.Result;
foreach(var labradorDog in list_of_labrador)
{
labradorDog.Bark();
//** WTH my labrador can't BARK** Bark method is not shown in intellisense there is compilation error if i explicitly specify
}
}
好的,嗯,让我说出你的话。以下是重现问题的步骤
创建Silverlight应用程序项目(让VS创建网站来托管应用程序)
创建一个Silverlight类库,在其中创建Dog类
将Silverlight类库编译为程序集(Dog.dll
)
将对Dog.dll
silverlight程序集的引用添加到silverlight应用程序项目
向项目添加WebService应用程序(DogService.asmx注意asmx
扩展名)
为Dog.dll
DogService
程序集的引用
从其中的WebMethod返回hardcoded List<Dog>
类
从Service添加引用到Silverlight应用程序,创建代理客户端实例并调用方法
看着你的狗也不能吠叫:(
答案 0 :(得分:5)
方法永远不会被序列化。只有数据。您的方法,事件,索引器,构造函数等将从不序列化。
无论如何,您不应该使用ASMX服务。请改用WCF。除其他外,WCF使您能够在客户端和服务之间共享数据类型。这将允许类似“序列化方法”的东西:在客户端和服务器上都可以使用相同的方法。
答案 1 :(得分:3)
您应该使用可移植类库http://msdn.microsoft.com/en-us/library/gg597391.aspx
定义所有公共类然后在Silverlight中使用Web服务时,您应该要求代理生成器重用这些类。这确保您获得所有功能。
Web服务定义(WSDL)仅处理字段/属性。方法不通过电线传输。