Дружище, как показала вышеупомянутая ссылка, мы можем использовать 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.
Кроме того, мы могли бы также использовать интерфейс IClientMessageInspector для создания постоянного заголовка сообщения SOAP, поскольку описанная выше операция добавления заголовка сообщения мыла работает только в операторе USING. Пожалуйста, обратитесь к моему предыдущему ответу.
Как передавать пользовательские учетные данные winform в службы WCF при каждом запросе?
Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.