我创建了WCF Web服务,部署并调试它。我写了一个控制台应用程序,引用了Web服务,一切正常。
现在,我正在尝试在Silverlight 3应用程序中使用Web服务。我在click事件中添加了以下代码。
TagServiceClient client = new TagServiceClient();
Tag[] tags = client.GetTags();
client.Close();
VS告诉我它无法找到GetTags()和Close()方法。但VS在控制台应用程序中对这些方法没有任何问题。
我在服务引用的前面添加了一个using语句。
我在根域和包含Web服务的文件夹中放置了clientaccesspolicy.xml文件。似乎没有任何改变,无论它在哪里。
发生了什么事?有什么建议?这是我第一次在Silverlight中使用Web服务,所以我可能会遗漏一些东西。
答案 0 :(得分:2)
您需要生成一个新的客户端代理以在Silverlight应用程序中使用 - IOW,从Silverlight应用程序中添加新的服务引用,并将其指向服务。
然后您将看到事情有所不同 - 您会发现代理中存在异步方法,而不是您在为控制台应用程序生成的代理中看到的同步方法。因此,在silverlight应用程序中,您的代码最终会看起来像这样:
client.GetTagsCompleted += [my event handler];
client.GetTagsAsync();
并在您的事件处理程序中:
if (e.Error == null)
if (!e.Cancelled)
List<Tag> tags = new List<Tag>(e.result);
当您将服务引用添加到silverlight应用程序时,请确保您在高级设置周围进行了操作,因为您可以更改返回项目的集合类型等(默认返回集合为{{ 1}})。
如果你想避免这种事情(不同的应用程序或模块的不同代理),那么考虑使用svcutil生成你的代理,而不是让VS这样做(VS不使用svcutil)。