0

我有以下WCF數據服務:如何從Silverlight應用程序調用Wcf數據服務中的自定義方法?

public class WcfDataService : DataService<WcfDataServiceContext> 
{ 
    public static void InitializeService(DataServiceConfiguration config) 
    { 
     config.SetEntitySetAccessRule("*", EntitySetRights.All); 
     config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); 
     config.UseVerboseErrors = true; 
    } 

    [WebGet] 
    public IQueryable<Person> GetPeopleByName(string name) 
    { 
     WcfDataServiceContext context = this.CurrentDataSource; 

     var match = from p in context.People 
        where p.FirstName == name 
        select p; 

     return match; 
    } 

我可以從瀏覽器訪問自定義的方法是這樣的:

http://127.0.0.1:8080/DataService/WcfDataService.svc/GetPeopleByName?name='Daniel' 

我如何調用該方法,並從獲得的人該列表Silverlight應用程序?

我正在使用Visual Studio 2012,Silverlight 5,.NET Framework 4.0。

+0

對不起,晚了。您是否有理由添加此服務,還是隻是示例?關於OData的真棒部分是它可以處理所有標準查詢(上面的例子)。在這種情況下,以下URL將返回相同的內容:「http://127.0.0.1:8080/DataService/WcfDataService.svc/People?$filter=FirstName eq'Daniel''。相應地,客戶端的LINQ組件可以讓您輕鬆地編寫該查詢:'context.People.Where(p => p.FirstName ==「Daniel」)'。如有必要,我可以詳細說明。 –

+0

你好馬克。謝謝您的回覆。我在客戶端實現了查詢。我目前在使用Silverlight中的string.Contains時遇到了問題。原始問題在這裏:http://stackoverflow.com/questions/13057260/error-in-wcf-data-service-when-using-string-contains-within-linq-statement-from 如何實現string.Contains生成substringof('text',DisplayName)eq true? – Daniel

回答

0

據我記得使用Silverlight的時候,你不能連接到一個不同於Silverlight應用程序的服務器,所以你只需要使用一個相對的Uri。如果你想使用WCF數據服務客戶端,你可以看看這裏:http://forums.silverlight.net/t/208481.aspx - 有一個代碼片段顯示它。但是AFAIK WCF數據服務客戶端不支持服務操作,因此您可能需要使用XmlReader才能查詢和分析GetPeopleByName函數的響應。

+0

嗨,Pawel,我爲我的Silverlight應用程序添加了一個服務引用。我不知道wcf數據服務客戶端不支持自定義方法。這意味着我必須對客戶端進行「context.People」所需的所有過濾,就像您發送給我的示例一樣。我明天會試試這個。謝謝您的回答。 – Daniel

+0

嗨,Pawel,我嘗試使用我的wcf數據服務,並且成功地查詢了我的實體。我在Silverlight中添加了一部分我的Wcf數據服務引用,並且在那裏創建了我的自定義方法。謝謝您的回答。 – Daniel

0

我做到了,我纔可以share.Service參考您的域名:8080 /的DataService/WcfDataService.svc然後 對於Person對象使用[DataContract]屬性爲Peson的性質使用[全球:: System.Runtime。 Serialization.DataMemberAttribute()]通過這種方式,你可以說Serialize並創建代理到總線端。注意這個屬性,因爲它真的有效!

//Here is the interface attributes are important 

namespace AHBSBus.Web.Services 
{ 
[ServiceContract] 
public interface IChatService 
{ 
    [OperationContract] 
    bool LogIn(Guid userID,Guid roomID); 

    [OperationContract] 
    bool LogOut(Guid userID,Guid roomID); 

    [OperationContract] 
    IEnumerable<VW_CHATUSERDETAIL> GetLatestMessages(Guid userID,Guid roomID,Guid lastSyncMessageID); 

    [OperationContract] 
    bool SendMessage(Guid fromID, Guid roomID, Guid toID, string message); 

    [OperationContract] 
    IEnumerable<ChatUser> GetLoggedInUsers(Guid roomID); 

    [OperationContract] 
    bool IsLogin(Guid roomID,Guid userID); 
} 
} 


//Implementation of service 

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public partial class ChatService:IChatService 
    { 
    //Here goes 
    } 
相關問題