Получить доменное имя запроса WCF? - PullRequest
0 голосов
/ 01 июня 2009

Как я могу получить доменное имя или полный URL запрашивающей стороны?

1 Ответ

3 голосов
/ 02 июня 2009

Я не уверен, что понимаю ваш вопрос, но если вам нужно доменное имя пользователя Windows, выполняющего вызов службы, используйте это:

OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name

Это вернет "{домен} \ {имя пользователя}".

Попробуйте это и дайте мне знать, что вы думаете (вы, вероятно, захотите вставить этот код в проект mstest):

[TestClass]
public class AlternativeCredentials
{
    // Contracts
    [ServiceContract]
    interface IMyContract
    {
        [OperationContract]
        string GetUserName();
    }

    // Service
    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    class MyService : IMyContract
    {
        public string GetUserName()
        {
            return OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name;
        }
    }

    // Client
    class MyContractClient : ClientBase<IMyContract>, IMyContract
    {
        public MyContractClient() { }
        public MyContractClient(Binding binding, string address) :
            base(binding, new EndpointAddress(address)) { }

        public string GetUserName()
        { return Channel.GetUserName(); }
    }

    #region Host
    static string address = "net.tcp://localhost:8001/" + Guid.NewGuid().ToString();
    static ServiceHost host;

    [ClassInitialize()]
    public static void MyClassInitialize(TestContext testContext)
    {
        host = new ServiceHost(typeof(MyService));
        host.AddServiceEndpoint(typeof(IMyContract), new NetTcpBinding(), address);
        host.Open();
    }

    [ClassCleanup()]
    public static void MyClassCleanup()
    {
        if (host.State == CommunicationState.Opened)
            host.Close();
    }
    #endregion  

    [TestMethod]
    public void UseUserNameCredentials()
    {
        using (MyContractClient proxy =
            new MyContractClient(new NetTcpBinding(), address))
        {
            proxy.ClientCredentials.UserName.UserName = "MyUsername";
            proxy.ClientCredentials.UserName.Password = "MyPassword";

            proxy.Open();
            Assert.AreEqual("EMS\\magood", proxy.GetUserName());
            proxy.Close();
        }
    }
}
...