我有一个WCF函数,“字符串GetDetails(int x,int y)”,它现在部署在Windows应用程序中的服务器上。我可以通过编写
来调用它的功能ServiceReference1.ServiceClient objService = new ServiceReference1.ServiceClient(); string data = objService.GetData(10,23);
但是在Silverlight中我无法做到这一点。为什么呢?
答案 0 :(得分:1)
因为SL只允许来自服务客户端的异步调用(但这并不一定意味着您的操作在服务器上是异步的)。
您必须执行以下操作:
ServiceReference1.ServiceClient objService = new ServiceReference1.ServiceClient();
objService.GetDataCompleted += OnGetDataCompleted;
objService.GetData(10,23);
private void OnGetDataCompleted(object sender, GetDataCompletedEventArgs e)
{
if (e.Error == null)
{
string data = e.Result;
// Do something with data
}
}
答案 1 :(得分:1)
您可能还想阅读ClientAccessPolicy.xml。这里是SO good link。简而言之,您的服务必须允许通过ClientAccessPolicy.xml文件授予Silverlight客户端对其域的访问权限来调用自身。这通常通过创建服务(可以在托管服务的同一项目中实现)来完成,以确保ClientAccessPolicy.xml文件在正确的位置可用。
如果您的服务是自托管的,您可以将这样的代码添加到您的服务启动(主要):
// This service is used to retrieve the client access policy to allow for cross-domain service calls.
ServiceHost ClientAccessPolicyService = null;
ClientAccessPolicyService = new ServiceHost(typeof(ClientAccessPolicyService));
ClientAccessPolicyService.Open();
这样的行(来自我们目前正在开发的项目,我确信这些设置将在我们部署时得到改进)被添加到服务的app.config文件中:
<service name="ClientAccessPolicyService">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8731/"/>
</baseAddresses>
</host>
<endpoint address=""
binding="webHttpBinding"
contract="IClientAccessPolicy"
behaviorConfiguration="HttpEnableBehavior">
</endpoint>
</service>
<endpointBehaviors>
<behavior name="HttpEnableBehavior">
<webHttp/>
</behavior>
</endpointBehaviors>
其中ClientAccessPolicyService是提供ClientAccessPolicy.xml文件的服务,而IClientAccessPolicy是OperationContract。
希望在此信息与上述链接(及其嵌入式链接)中的信息之间,您可以从Silverlight访问您的服务。我可能会遗漏更多内容,但我真的只是开始使用WCF和Silverlight,所以我很幸运能够运行某些东西!
祝你好运!