Как исправить ошибку в WCF "получение ошибки в WCF :сообщение содержит недопустимый или истекший токен контекста безопасности".
Я создал проект библиотеки WCF ConversionAgents и тестовый клиент
Теперь при выполнении решения я получаю ошибку.
- Сообщение не может быть обработано. Это, скорее всего, потому, что действие 'http://tempuri.org/ICustomService/GetCurrencyData" неверно или потому, что сообщение содержит недопустимый или истекший токен контекста безопасности, или потому, что существует несоответствие между привязками. Маркер контекста безопасности был бы недействителен, если бы служба прервала канал из-за бездействия. Чтобы служба не прерывала сеансы ожидания преждевременно, увеличьте время ожидания приема привязки конечной точки службы.”
Вопрос : пожалуйста, дайте мне знать, что не так в приведенной ниже логике вызова службы путем динамического создания конечной точки.
[ServiceContract] public interface ICustomService { [OperationContract] ConversionData GetCurrencyData(ConversionData conversionData); [OperationContract] bool AuthenticateUser(string userName, string password); }
Создал конечную точку с помощью wsHttpBinding.
<service name="CurrencyConversionAgents.CustomService"> <endpoint address="" binding="wsHttpBinding" bindingName="wsMessage" contract="CurrencyConversionAgents.ICustomService"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" name="Mex" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="http://localhost/ConversionAgents/CustomService/" /> </baseAddresses> </host> </service> </services> <bindings> <wsHttpBinding> <binding name ="wsMessage"> <security mode ="None"> </security> </binding> </wsHttpBinding> </bindings>
Теперь создал тестовый клиент, показанный ниже, чтобы вызвать эту службу с помощью IChannelFactory.
namespace TestClient { class Program { static void Main(string[] args) { WSHttpBinding binding = new WSHttpBinding(SecurityMode.None); //binding.ReliableSession = IChannelFactory<IRequestChannel> factory = binding.BuildChannelFactory<IRequestChannel>( new BindingParameterCollection()); factory.Open(); EndpointAddress address = new EndpointAddress("http://localhost/ConversionAgents/CustomService/"); IRequestChannel irc = factory.CreateChannel(address); string request = String.Empty; using (irc as IDisposable) { irc.Open(); request = String.Format(@"<GetCurrencyData xmlns='http://tempuri.org/'> <conversionData xmlns:d4p1='http://schemas.datacontract.org/2004/07/ConversionAgents' xmlns:i='http://www.w3.org/2001/XMLSchema-instance'> <d4p1:ConversionDate>{0}</d4p1:ConversionDate> <d4p1:CovertedAmount>{1}</d4p1:CovertedAmount> <d4p1:FromCurrency>{2}</d4p1:FromCurrency> <d4p1:Password>{6}</d4p1:Password> <d4p1:SourceAmount>{3}</d4p1:SourceAmount> <d4p1:ToCurrency>{4}</d4p1:ToCurrency> <d4p1:UserName>{5}</d4p1:UserName> </conversionData> </GetCurrencyData>", XmlConvert.ToString(DateTime.Now, XmlDateTimeSerializationMode.Local), "", "USD", "1", "INR", "admin", "demo"); XmlReader reader = XmlReader.Create(new StringReader(request)); Message m = Message.CreateMessage(MessageVersion.Soap12WSAddressing10, "http://tempuri.org/ICustomService/GetCurrencyData", reader); Message ret = irc.Request(m); reader.Close(); Console.WriteLine(ret); Console.ReadLine(); } //close the factory factory.Close(); }