如何验证WCF数据服务?

Lou*_*man 6 wcf wcf-data-services

我创建了一个以Azure辅助角色托管的ADO.Net WCF数据服务.我想将凭证从简单的控制台客户端传递到服务,然后使用QueryInterceptor验证它们.不幸的是,凭证似乎没有通过网络.

以下是我正在使用的代码的简化版本,从服务器上的DataService开始:

using System;
using System.Data.Services;
using System.Linq.Expressions;
using System.ServiceModel;
using System.Web;

namespace Oslo.Worker
{
    [ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
    public class AdminService : DataService<OsloEntities>
    {
        public static void InitializeService(
            IDataServiceConfiguration config)
        {
            config.SetEntitySetAccessRule("*", EntitySetRights.All);
            config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
        }

        [QueryInterceptor("Pairs")]
        public Expression<Func<Pair, bool>> OnQueryPairs()
        {
            // This doesn't work!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            if (HttpContext.Current.User.Identity.Name != "ADMIN")
                throw new Exception("Ooops!");

            return p => true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我用来在Azure工作者角色中实例化AdminService的AdminService:

using System;
using System.Data.Services;

namespace Oslo.Worker
{
    public class AdminHost : DataServiceHost
    {
        public AdminHost(Uri baseAddress)
            : base(typeof(AdminService), new Uri[] { baseAddress })
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,这是客户端代码.

using System;
using System.Data.Services.Client;
using System.Net;
using Oslo.Shared;

namespace Oslo.ClientTest
{
    public class AdminContext : DataServiceContext
    {
        public AdminContext(Uri serviceRoot, string userName,
            string password) : base(serviceRoot)
        {
            Credentials = new NetworkCredential(userName, password);
        }

        public DataServiceQuery<Order> Orders
        {
            get
            {
                return base.CreateQuery<Pair>("Orders");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该提一下,代码适用于信号异常,即凭证不通过线路传递.

在这方面的任何帮助将不胜感激!

谢谢....

Rus*_*sby 1

您必须抛出DataServiceException类型的异常。