在Windows应用程序和Silverlight中使用WCF的过程有什么区别?

时间:2010-11-15 08:20:46

标签: silverlight wcf

我有一个WCF函数,“字符串GetDetails(int x,int y)”,它现在部署在Windows应用程序中的服务器上。我可以通过编写

来调用它的功能

ServiceReference1.ServiceClient objService = new ServiceReference1.ServiceClient(); string data = objService.GetData(10,23);

但是在Silverlight中我无法做到这一点。为什么呢?

2 个答案:

答案 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,所以我很幸运能够运行某些东西

祝你好运!