Тема: WCF:Проблема зі зв'язкою wsHttpBinding та сеансами

Добрий день. Підскажіть, будь ласка, чому не виконується код? Як відомо, зв'язка basicHttpBinding не підримує сеансів, тоді як зв'язка wsHttpBinding повинна їх підтримувати. Але чому тоді не спрацьовує такий код:

Конфігураційний файл:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <system.serviceModel>
      <bindings>
        <wsHttpBinding>
          <binding name="SessionRel">
            <reliableSession enabled="true"/>
          <security mode="Message">
          </security>
          </binding>
        </wsHttpBinding>
      </bindings>
      <services>
        <service name="ServiceDefaultInstanceConcurrency.StockService">
           <host>
             <baseAddresses>
                <add baseAddress="http://localhost:8082/StockService"/>
             </baseAddresses>
           </host>
           <endpoint address="" bindingConfiguration="SessionRel" binding="wsHttpBinding" contract="ServiceDefaultInstanceConcurrency.IStockService"></endpoint>
          </service>
      </services>
    </system.serviceModel>
</configuration>

А ось контракт разом зі службою

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using System.Threading;
using System.Runtime.Serialization;

namespace ServiceDefaultInstanceConcurrency
{
    [DataContract]
    public class StockPrice
    {
        [DataMember]
        public double price;
        [DataMember]
        public int calls;
    }
    [ServiceContract(SessionMode = SessionMode.Required)]
    public interface IStockService
    {
        [OperationContract]
        StockPrice GetPrice(string ticker);
    }
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class StockService : IStockService
    {
        object lockthis = new object();
        private int n_Calls = 0;
        StockService()
        {
            Console.WriteLine("{0} В потоке создан новый экземпляр StockService", DateTime.Now);

        }
        public StockPrice GetPrice(string ticker)
        {
            StockPrice p = new StockPrice();
            Console.WriteLine("{0}: GetPrice вызван в потоке {1}", DateTime.Now, Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(5000);
            p.price = 9.48;
            lock (lockthis)
            {
                p.calls = ++n_Calls;
            }
            return p;
        }
    }
   public class Program
    {

       public static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(StockService));
            host.Open();
            Console.WriteLine("Нажмите ENTER, чтобы завершить");
            Console.ReadLine();
            host.Close();
        }
    }
}

Ця програма просто вилітає без генерації виключення, яке з'являється лише в час, коли починаєш її відлагоджувати. Тоді виникає виключення, що генерується в операції Open() екземпляру ServiceHost:

Ось саме виключення:

"Необроблюване виключення типу "System.ExecutionEngineException" в System.ServiceModel.dll".

2

Re: WCF:Проблема зі зв'язкою wsHttpBinding та сеансами

Що ж... як я зрозумів, то ніхто не знає, чому так відбувається...

3

Re: WCF:Проблема зі зв'язкою wsHttpBinding та сеансами

Здається знайшов відповідь. Якщо кому буде необхідно, то ця відповідь має такий характер. Я намагався запустити цей код в операційній системі Windows 8, але, як вийшло, Metro Style App не підримує цього типу зв'язку, не підримує Windows 8 і зв'язку ws2007HttpBinding, так як взагалі не підримує специфікаціі WS-*. В Windows 8 підтримуються лише такі зв'язки:

BasicHttpBinding
NetTcpBinding
NetHttpBinding
CustomBinding

Більше інформації про це можна дізнатися
тут (WCF in Metro apps – supported functionality) та
тут (Connecting Windows 8 applications with services: Part 1: Using services to get data in our Windows 8 applications).

Подякували: koala, 0xDADA11C72

4 Востаннє редагувалося lesha.ievenko (01.06.2014 13:52:17)

Re: WCF:Проблема зі зв'язкою wsHttpBinding та сеансами

Спасибі за подяки, але я поки що, як виявилось, не знайшов вирішення проблеми. Запустив той же самий код на іншій машині під Windows 8.1 — і код відпрацював навідмінно. Крім цього, як виявилось у режимі відлагодження, якщо запустити код від точки останова до точки останова, він навіть на моїй машині відпрацьовує навідмінно, а от якщо запускаю в режимі без відлагодження код просто вилітає на операції Open() екземпляра ServiceHost. Коли ж відбувається пошук операцийною системою засобу виправити помилку, то далі є можливість увійти в режим відлагодження й отримати виключення, що породжується в бібліотеці ServiceModel.dll. 

Чесно кажучи, нічого не розумію... Допоможіть, хто знає, що це таке та як з цим боротися..

5

Re: WCF:Проблема зі зв'язкою wsHttpBinding та сеансами

Кінець-кінцем вирішив проблему. Все ж операційна система була винуватцем. Довелось відновлюватись з образу, після чого все запрацювало. Спочатку подумав, що студія винуватцем стала, а тому вирішив відновити її з диску, але все залишилось так як і було.., тому довелось попрацювати с операційною системою... І вирішив питання...