2012-12-20 2 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; 
} 

그것은 ProviderUseId 그냥 숫자이기 때문에 트위터에 잘 작동하지만, 구글과 야후에 대한 UserId이 URL 인 내가 할 수있는 일치시키지 마라. URL이 같다는 것을 알더라도 항상 0 개의 결과가 나온다. 나는 URL (또는 다른 쿼리가 실패합니다) 이스케이프 해요,하지만 어떻게해야 일치처럼 그것을 찾을 수 있습니까?

===== 편집

내가 내가 먼저 공급자에 쿼리하여 작동시킬 수있어 - (A 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(); 
    } 
}