Как передавать пользовательские учетные данные winform в службы WCF при каждом запросе? - PullRequest
0 голосов
/ 05 марта 2019

То, чего я пытаюсь добиться, - это передавать учетные данные / токен службам WCF при каждом запросе.Кстати, эти учетные данные НЕ являются учетными данными Windows, они получены из пользовательских БД, и логика аутентификации довольно проста, tenantId + имя пользователя + пароль.

В настоящее время я использую инспектор сообщений, чтобы вставить такую ​​информацию взаголовки и извлекайте их из инспектора на стороне сервера (используя OperationContext).

Но чтобы оставаться поточно-ориентированным, я должен обернуть запросы в каждый запрос winform следующим образом:

using (new OperationContextScope((WcfService as ServiceClient).InnerChannel))
{
   MessageHeader hdXXId = MessageHeader.CreateHeader("XXId", "CustomHeader", WinformSomeVariable.XXId);
   OperationContext.Current.OutgoingMessageHeaders.Add(hdXXId);

   _objXX = WcfService.GetXXById(id);

}

Как показано выше, это довольно тяжелый и явно не умный способ справиться с этой ситуацией.Так есть ли способ надежно хранить информацию такого рода, а также получить ее у инспекторов WCF?

Большое спасибо!

PS.Благодаря @Abraham Qian я все время был глупым.Просто поместите инспектора клиента в тот же проект winform, чтобы решить эту проблему.

1 Ответ

0 голосов
/ 07 марта 2019

Просто проигнорируйте вопрос о том, как на мгновение изменить вашу аутентификацию. Что касается того, как использовать интерфейс IClientMessageInspector для создания постоянного заголовка сообщения, может быть полезен следующий фрагмент кода (предположим, что вызов с использованием Channel Factory)

class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri("http://localhost:1300");
            IService service = ChannelFactory<IService>.CreateChannel(new BasicHttpBinding(), new EndpointAddress(uri));
            try
            {
                Console.WriteLine(service.SayHello());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
    }

    [ServiceContract(Namespace = "mydomain")]
    [CustomContractBehavior]
    public interface IService
    {
        [OperationContract]
        string SayHello();
    }

    public class ClientMessageLogger : IClientMessageInspector
    {
        public void AfterReceiveReply(ref Message reply, object correlationState)
        {
            string displayText = $"the client has received the reply:\n{reply}\n";
            Console.Write(displayText);
        }

        public object BeforeSendRequest(ref Message request, IClientChannel channel)
        {
        //Add custom message header
            request.Headers.Add(MessageHeader.CreateHeader("myheader","mynamespace",2000));
            string displayText = $"the client send request message:\n{request}\n";
            Console.WriteLine(displayText);
            return null;

        }
    }

    public class CustomContractBehaviorAttribute : Attribute, IContractBehavior, IContractBehaviorAttribute
    {
        public Type TargetContract => typeof(IService);

        public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
            return;
        }

        public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
            clientRuntime.ClientMessageInspectors.Add(new ClientMessageLogger());
        }

        public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
        {
            return;
        }

        public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
        {
            return;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...