Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Странное отличие


Автор: starostin 26.5.2011, 09:11
Откуда не возьмись появилось странное поведение службы. Запускаеться сервис хостовым приложением. Когда я его запускаю в вижуал студии, всё проходит гладко, все контракты отвечают как надо, всё путём. Но если я запускаю хостовое приложение, которое поднимает сервис, вручную(то бишь два раза щёлкаю мышкой по экзешнику smile ), то браузер мне говорит что отключена публикация метаданных(при запуске из vs напоминаю всё нормально), контракты соответственно не отвечают, wcftestclient говорит ошибку но привести её не могу, потому что там усё в нераспозноваемой кодировке.
Что я мог упустить? Странности ситуации добавляет то, что пару дней назад, до добавления одного из контрактов всё работало на ура, и его удаление из проекта результатов не даёт.

Автор: jonie 26.5.2011, 10:52
под кем запускается (юзер) сервис и клиент? Какая авторизация стоит?  Часом не Windows ?

Автор: starostin 26.5.2011, 11:10
Авторизацию не включал, оба запускаются с правами админа. Если бы была проблема с эти, то и раньше бы не работало, а сервис уже почти неделю работал исправно. Мне кажется, что как то не правильно регистрирую хоста
Код

namespace SertificateOutServiceHost
{
    class Program
    {
        static void Main(string[] args)
        {SertificateSvc s = SertificateSvc.Service;
              try
              {
                  s.Start();
                  Console.WriteLine("Nice service is start :)");
              }
              catch
              {
                  Console.WriteLine("Fucking service dont start");
              }

              while (Console.ReadLine().ToLower() != "exit") { }
              s.Stop();
              return;
}}}

namespace SertificateOutService
{

    public sealed class SertificateSvc : ServiceBase
    {
        private static SertificateSvc _WcfService;
        private ServiceHost _SvcHost;
        public static SertificateSvc Service
        {
            get
            {
                _WcfService = _WcfService ?? new SertificateSvc();
                return _WcfService;
            }
        }
        public SertificateSvc()
        {
            Uri baseAddress = new Uri("http://localhost:8137/Sertificate");
            // Регистрация сервиса и его метаданных
            _SvcHost = new ServiceHost(typeof(Service1),baseAddress);
        }
        public void Start()
        {
            _SvcHost.Open();
        }
        public void Stop()
        {
            _SvcHost.Close();
        }
        private void InitializeComponent()
        {
            this.ServiceName = "SertificateSvc";
        }
    }
}

Автор: jonie 26.5.2011, 14:28
очень плохая идея делать в Start сервиса такие тяжелые операции как открытие SvcHost-а : _SvcHost.Open();

netstat -an показывает активность на 8137 порту? 
Прописан ли app.config для сервиса правильно?
"Под админом обе" - у вас пользователь называется "MachineName\Админ"  и под ним запускаетесь?*
"Я ничего не прописывал с т.з. аутентификации"  - вовсе не означает что указанный вами binding по умолчанию не имеет такой защиты. wsHttpBinding  например как я помню использует по умолчанию как раз Windows аутентификацию (и перед установкой связи посылаются  доп. пакеты для установки безопасного соединения как раз и отвечающие за установку типа утентификации (Kerberos\Windows) и контекста безопасности)..... хотя тут я могу ошибаться  - надо читать msdn.

*) "Права админа" это "сферический конь" в известном месте ...

Автор: starostin 27.5.2011, 08:40
Ну если плохо так хост открывать, то расскажите пожалуйста мне как правильно. На порте состояние listening.
Конфиг примитивный
Код

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  
  <system.web>
    <compilation debug="true" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="SertificateOutService.Service1" behaviorConfiguration="SertificateBehavior">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8137/Sertificate" />
          </baseAddresses>
        </host>
         <endpoint address ="" binding="basicHttpBinding" contract="SertificateOutService.IService1">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SertificateBehavior">
          <serviceMetadata httpGetEnabled="True" policyVersion="Policy12" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

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

Автор: starostin 27.5.2011, 09:35
Вот чё я заметил, убрал галку в свойвствах "Запустить узел службы WCF при отладке...", тогда и при отладке все те же проблемы, что и при ручном запуске, что за галяк такой? Нужно ли его вабще вручную запускать?

Автор: starostin 27.5.2011, 12:03
Теперь я уверен, что дело не в автризации и правах, я добавил публикацию метаданных и бехейвер в код программы, что позволило браузеру получить эти данные. Значит, почему то сервис не может прочитать свой кофиг. Что бы это могло значить?

Автор: jonie 27.5.2011, 14:59
starostin, а вы конфиг показывали нам какого проекта? того что называется myservice.exe.config надеюсь, а не app.config из проекта "my_wcf_library.dll" ?

в myservice.exe.config-е должно быть объявление нормальное параметров...
Цитата(starostin @  27.5.2011,  08:40 Найти цитируемый пост)
Ну если плохо так хост открывать, то расскажите пожалуйста мне как правильно

дело в том что на старт сервиса дается ограниченное количество времени. операция открытия wcf по моим замерам долгая (куча либ поднимается, открываются соединения). Я бы предпочел делать ее в отдельном потоке (поток создавать в OnStart как раз).

Код

_SvcHost = new ServiceHost(typeof(Service1) /*,baseAddress*/);  //base адрес тут не нужен - вы его и так в конфиге задаете

Автор: starostin 30.5.2011, 10:08
хм, я сильно озадачен. В моём решение, только wcflibrary-проект имеет конфиг,  у второго консольного проекта конфига нет. Конфиг дллки в дебаге по содержанию совпадает с app.config в проекте

Я думаю яснее всё будет если я дам посмотреть сам проект:

Автор: starostin 30.5.2011, 12:58
Чё то я повнимательней поглядел на ошибку выдаваемую wcftestclient:

ЋиЁЎЄ : ЌҐ г¤ Ґвбп Ї®«гзЁвм ¬Ґв ¤ ­­лҐ Ё§ http://localhost:8137/Sertificate/mex …б«Ё г ў б Ґбвм ¤®бвгЇ Є б«г¦ЎҐ Windows ® Communication Foundation, гЎҐ¤ЁвҐбм, зв® ўЄ«о祭  ЇгЎ«ЁЄ жЁп ¬Ґв ¤ ­­ле Ї® гЄ § ­­®¬г  ¤аҐбг. ‘Їа ў®з­лҐ ᢥ¤Ґ­Ёп Ї® ўЄ«о祭Ёо ЇгЎ«ЁЄ жЁЁ ¬Ґв ¤ ­­ле б¬. ў ¤®Єг¬Ґ­в жЁЁ MSDN Ї®  ¤аҐбг http://go.microsoft.com/fwlink/?LinkId=65455.ЋиЁЎЄ  б«г¦Ўл ®Ў¬Ґ­  ¬Ґв ¤ ­­л¬Ё WS-Metadata Exchange    €¤Ґ­вЁдЁЄ в®а URI: http://localhost:8137/Sertificate/mex    ЊҐв ¤ ­­лҐ ᮤҐа¦ в ­Ґа §аҐиЁ¬го ббл«Єг: "http://localhost:8137/Sertificate/mex".    ’ЁЇ ᮤҐа¦Ё¬®Ј® application/soap+xml; charset=utf-8 ­Ґ Ї®¤¤Ґа¦Ёў Ґвбп б«г¦Ў®© http://localhost:8137/Sertificate/mex. ќв® ¬®¦Ґв Ўлвм ўл§ў ­® ­Ґб®®вўҐвбвўЁҐ¬ ЇаЁўп§®Є Є«ЁҐ­в  Ё б«г¦Ўл.    “¤ «Ґ­­л© бҐаўҐа ў®§ўа вЁ« ®иЁЎЄг: (415) Cannot process the message because the content type 'application/soap+xml; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'..ЋиЁЎЄ  HTTP GET    URI: http://localhost:8137/Sertificate/mex    ‚®§­ЁЄ«  ®иЁЎЄ  ЇаЁ § Јаг§ЄҐ "http://localhost:8137/Sertificate/mex".    ‘Ў®© § Їа®б  б б®бв®п­ЁҐ¬ HTTP 400: Bad Request.

Паходу чё то с кодировкой сталось, но как и ранее странно, ведь я к кодировкам не прикосался

Автор: starostin 1.6.2011, 09:02
Такс, я решил забить на конфиг и прописать все настройки в коде, нашёл на одном бложке как должен выглядить код, но не знаю как отключить app.config, что бы сервис не лез в него за настройками. Что для этого надо сделать?

Автор: starostin 8.6.2011, 13:09
Ну в общем решил я проблему сменив язык вижуал студии, а так же сменив версию soap в конфиге клиента

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)