Добавление заголовка сообщения к запросу - PullRequest
0 голосов
/ 26 июня 2019

Попытка добавить этот заголовок к моему запросу в c #:

<soap:Header>
<UserCredentials soap:mustUnderstand="1" xmlns="http://test.credential.com/UserCredentials" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<CicsUsername xmlns="http://schemas.test.org/2004/07/test.Mainframe">ciscs</CicsUsername>
<TechnicalPassword "http://schemas.test.org/2004/07/test.Mainframe">password</TechnicalPassword>
<TechnicalUsername "http://schemas.test.org/2004/07/test.Mainframe">user</TechnicalUsername>
</UserCredentials>
</soap:Header>   

Я пробовал это безуспешно:

https://blogs.msdn.microsoft.com/wsdevsol/2014/02/07/adding-custom-messageheader-and-http-header-to-a-wcf-method-call-in-a-windows-store-app-or-windows-phone-app/

ВидС уважением

/ Руди

1 Ответ

0 голосов
/ 28 июня 2019

Дружище, как показала вышеупомянутая ссылка, мы можем использовать OperationContext для добавления пользовательского заголовка сообщения. Пожалуйста, обратитесь к приведенному ниже примеру, если он вам полезен.
Сервер (Консольное приложение, 10.157.13.69:3336)

class Program
    {
        static void Main(string[] args)
        {

            using (ServiceHost sh=new ServiceHost(typeof(MyService)))
            {
                sh.Open();
                Console.WriteLine("service is ready....");

                Console.ReadLine();

                sh.Close();
            }
        }
    }
    [ServiceContract]
    interface IService
    {
        [OperationContract]
        void WriteMessageHeader();
    }
    public class MyService : IService
    {
        public void WriteMessageHeader()
        {
            OperationContext oc = OperationContext.Current;
            //output the SOAP Message Header.
            for (int i = 0; i < oc.IncomingMessageHeaders.Count; i++)
            {
                MessageHeaderInfo info = oc.IncomingMessageHeaders[i];
                Console.WriteLine("Name: "+info.Name);
                Console.WriteLine("Namespace: "+info.Namespace);
                Console.WriteLine("Content: "+oc.IncomingMessageHeaders.GetHeader<string>(i));

            }
        }
}

Appconfig на стороне сервера.

<system.serviceModel>
    <services>
      <service name="Server1.MyService">
        <endpoint address="" binding="basicHttpBinding" contract="Server1.IService" ></endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:3336"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpsGetEnabled="true" httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Клиент (Консольное приложение, вызов с ChannelFactory)

  class Program
        {
            static void Main(string[] args)
            {
                BasicHttpBinding binding = new BasicHttpBinding();
                Uri uri = new Uri("http://10.157.13.69:3336");
                ChannelFactory<IService> factory = new ChannelFactory<IService>(binding, new EndpointAddress(uri));
                IService service = factory.CreateChannel();
                //without adding additional messsage header, generally invoke
                service.WriteMessageHeader();
                //add additional message header.
                using (OperationContextScope scope=new OperationContextScope((IContextChannel)service))
                {
                    //insert custom message header
                    OperationContext oc = OperationContext.Current;
                    MessageHeader mh = MessageHeader.CreateHeader("MyMessageHeaderName", "MyMessageHeaderNamespace", "myvaule");
                    oc.OutgoingMessageHeaders.Add(mh);
                    service.WriteMessageHeader();
                }
                Console.ReadLine();



            }
        }
        [ServiceContract]
        interface IService
        {
            [OperationContract]
            void WriteMessageHeader();
    }

Result.
enter image description here
Кроме того, мы могли бы также использовать интерфейс IClientMessageInspector для создания постоянного заголовка сообщения SOAP, поскольку описанная выше операция добавления заголовка сообщения мыла работает только в операторе USING. Пожалуйста, обратитесь к моему предыдущему ответу.
Как передавать пользовательские учетные данные winform в службы WCF при каждом запросе?
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...