我正在尝试从Silverlight应用程序中获取Web服务的数据。不幸的是,当试图连接时,Silverlight应用程序(Bing地图应用程序)就会挂起。
我在控制台应用程序中使用相同的代码,它可以正常工作。
我需要在silverlight中做些什么特别的事情让它发挥作用?我没有任何例外 - 它只是挂起。
我的服务和客户端代码基于此示例 http://www.switchonthecode.com/tutorials/wcf-tutorial-basic-interprocess-communication
问题和疑问:
1。为什么我不能在我的sliverlight代码中设置断点?
2。如何从Silverlight应用程序成功调用WCF服务?(链接到SIMPLE工作示例会很棒 - 我似乎发现的所有内容似乎都非常先进(RIA,Duplex等)其中许多也显示xml和其他非C#“代码” - 坦率地说,我不知道它们的作用以及它们与项目,代码和服务的关系。
(显然我对WCF和silverlight一无所知)
根据代码请求:
[ServiceContract]
public interface ILGSMapServer
{
[OperationContract]
List<double> GetLatitudes();
}
public class TreeWorkClient
{
ChannelFactory<ILGSMapServer> httpServer;
public ILGSMapServer httpProxy;
public TreeWorkClient()
{
httpServer = new ChannelFactory<ILGSMapServer>(new BasicHttpBinding(), new EndpointAddress("http://localhost:8000/GetLatitudes"));
httpProxy = httpServer.CreateChannel();
}
public List<TreeWorkItem> GetLocations()
{
List<double> lats = httpProxy.GetLatitudes();
//... do stuff in code
return ret;
}
}
答案 0 :(得分:2)
我同意John Saunders的观点 - 如果您发布了客户端代码,那么回答这个问题会更容易。
然而,作为猜测,从Silverlight应用程序调用服务的一个常见问题是Silverlight对跨域调用的限制。
总之,如果您的服务与Silverlight应用程序的原始站点位于不同的域,则需要在服务位置创建客户端访问策略文件。
详情请见:
http://msdn.microsoft.com/en-us/library/cc197955(v=vs.95).aspx
答案 1 :(得分:1)
鉴于您的示例代码,您应该看到
System.InvalidOperationException:合同'ILGSMapServer' 包含不支持的同步操作 Silverlight的。将操作拆分为“开始”和“结束”部分并进行设置 OperationContractAttribute上的AsyncPattern属性为'true'。 请注意,您不必在服务器上进行相同的更改。
您需要将服务合同更改为以下
[ServiceContract]
public interface ILGSMapServer {
[OperationContract( AsyncPattern = true )]
IAsyncResult BeginGetLatitudes( AsyncCallback callback, object context );
List<double> EndGetLatitudes( IAsyncResult result );
}
这也意味着您需要在GetLocations()函数中执行完全不同的操作,因为此函数将在返回Web结果之前返回。
尝试查看示例here。
其他选项涉及使用“添加服务引用”而不是在代码中手动定义它。
答案 2 :(得分:0)
我相信你需要在WCF服务上使用这个属性让SL使用它:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
至于调试 - 您可以调试Silverlight,尝试使用IE浏览器,这是SL调试的最自然的浏览器(遗憾的是)。
一旦你开始调试,当你捕获跨域异常或其他一些异常时,它会更清楚是错误的。