2010-11-15 69 views

回答

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 
    } 
} 
+0

需要注意的是,SL只允許異步調用的原因是SL在UI線程上執行,非異步會阻止UI更新。您可以在SL中產生線程,但是將所有東西都作爲UI應用程序的更好模式並加以實施,避免程序員不得不用繁雜的線程管理代碼來代碼(儘管它並不那麼複雜)。 – 2011-03-24 20:02:25

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,所以我感到幸運的東西運行!

祝你好運!

相關問題