查询中包含URL的WCF数据服务

时间:2012-12-20 17:10:28

标签: c# wcf-data-services url-encoding

我正在努力通过WCF数据服务设置OAuth。我在尝试查询提供者用户密钥的数据源时遇到问题,因为在某些情况下密钥是URL。例如,对于Google https://www.google.com/accounts/o8/id?id=AItOawnDT8v-6rdRI221piLFbOBT1m3EYTizmDQ

我有以下功能:

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是一个网址,我无法让它匹配 - 它总是出现0结果即使我知道URL是相同的。我正在逃避URL(否则查询会失败),但我怎么能让它找到匹配的呢?

=====修改

我知道我可以先通过查询提供程序来获取它 - 然后执行ToList()然后查询ProviderUserId - 然后就不必对其进行编码,因为它不会通过DataServices发送。但是我不喜欢将每条记录拉回到整个线路的单一提供商的想法,只是作为一种解决方法。

1 个答案:

答案 0 :(得分: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();
    }
}