2009-06-01 12 views
0

リクエスタのドメイン名または完全なURLはどのように入手できますか?WCFリクエストのドメイン名を取得しますか?

+0

あなたがサービスにアクセスするために使用されるURLを意味しましたか?クライアントのアイデンティティ? –

+0

クライアントの参照先ドメインがありません。 – DDiVita

答えて

3

は、私はあなたの質問を理解していることをわからないんだけど、あなたはサービス操作への呼び出しを行う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(); 
     } 
    } 
} 
+0

これを試してみます。ありがとう – DDiVita

+0

これについて数分考えた後、私は実際のサービスのセキュリティを習得していません。このメソッドを呼び出すと、プロセスを実行しているユーザーが何人いるかがわかりますか?サービスを実行しているシステムアカウントのドメイン名/ユーザー名が表示されると思います。右? – DDiVita

+0

上記の例では、 "EMS \ magood"は私のWindows IDです。 WCFの既定値はClientCredentialType = Windowsです。これを[TCPバインディングの基本]に変更できます。どのようなバインディングを使用していますか? –

関連する問題