2012-12-20 51 views
4

我正在通過WCF數據服務設置OAuth。在嘗試查詢提供程序用戶密鑰的數據源時遇到問題,因爲在某些情況下,密鑰是一個URL。例如,谷歌https://www.google.com/accounts/o8/id?id=AItOawnDT8v-6rdRI221piLFbOBT1m3EYTizmDQ查詢中帶有URL的WCF數據服務

我有以下功能:

public override int GetUserIdFromOAuth(string provider, string providerUserId) 
{ 
    var encodedUserId = Uri.EscapeDataString(providerUserId); 
    var user = service.OAuthMemberships 
         .Where(o => o.Provider == provider && 
            o.ProviderUserId == encodedUserId) 
         .SingleOrDefault(); 
    if (user == null) 
     return -1; 

    return user.UserId; 
} 

它的偉大工程Twitter並自ProviderUseId只是一個數字,但對谷歌和雅虎在UserId是一個URL,我可以不要讓它匹配 - 即使我知道URL是相同的,它總是會產生0個結果。我正在轉義URL(否則查詢會失敗),但是我怎麼才能找到它匹配的應該?

=====編輯

我知道我可以得到它的第一次查詢的提供商合作 - 做一個ToList(),然後在ProviderUserId查詢 - 那就不是必須對其進行編碼因爲它不會通過DataServices發送。但是我不喜歡這樣的想法,即通過線路將單個提供商的每條記錄都作爲解決方法提供給用戶。

回答

0

爲了實現這個目標,我建立了一個服務操作來處理這個問題,但是我仍然很好奇這個問題是否存在「真實」的答案。

[WebGet] 
public IEnumerable<OAuthMembership> GetOAuthUser(string provider, 
               string providerUserId) 
{ 
    providerUserId = Uri.UnescapeDataString(providerUserId); 
    using (var db = new WebsiteMembershipEntities()) 
    { 
     return db.OAuthMemberships.Where(o=>o.Provider == provider && 
              o.ProviderUserId == providerUserId) 
       .ToList(); 
    } 
}