WCF: можно ли переместить все настройки сервиса за пределы файла конфигурации и в коде? - PullRequest
1 голос
/ 18 июня 2010

У меня есть WCF, который используется уже более года, зашифрован кем-то другим, и я пытаюсь его реорганизовать, но способ организации структуры папок и файл svc.cs, содержащий методы, не тот, который я я привык из образцов WCF я завершено .

Вот то, чего я пытаюсь достичь. Поскольку ни одна из настроек не изменилась за последний год, меня попросили жестко закодировать все настройки сервиса в коде. Служба размещена в большом и существующем веб-приложении (и я должен оставить его там), файл svc содержит метод, вызываемый клиентом, и этот файл svc.cs не находится в корне виртуального каталога, но глубже, скажем, <virtualDirectory>/WebServices/PotatoWebService/PotatoWebService.svc, не вызывает ли его отсутствие в корневом каталоге виртуального каталога?

Поскольку я перемещаю конфигурацию из файла конфигурации, я сейчас создаю службу, хост, конечную точку, привязку в файле global.axax.cs веб-приложения на ApplicationStart(), и это то место, с которого нужно начать этот сервис в веб-приложении?

Возможно ли переместить все в коде, не только конечную точку, но и весь контент поведения, службы и системы. ServiceModel, найденный в файле web.config, чтобы «очистить» файл конфигурации и остановить поддержка менеджеров и настройка конфигурации с настройками, которые им не нужны?

Если это так, я пытался в течение 2 дней заставить это работать безуспешно. Теперь, согласно netstat, у меня запущена и работает служба, но когда я открываю свой файл svc в браузере, появляется исключение, в котором говорится, что для службы нет определенных конечных точек, хотя согласно nstat у меня запущена служба:

netstat -a | find LISTENING

...
  TCP    machineName:8097      elamontagne.potato.com:0  LISTENING
...

Итак, у меня запущена служба, но svc-файл не знает об этом и не может использовать его конечные точки, клиент пытается связаться со службой и не может найти его, потому что у службы нет конечной точки, есть какие-либо советы по сужению Советы по устранению неполадок в этой ситуации?

     //Address
    string hostingAddress = "PotatoVirtualDirectory/PotatoService/PotatoService.svc";   
    // Binding
    BasicHttpBinding PotatoServiceBinding = ConfigurePotatoServiceBinding(serviceSecurityMode);
    // Contract
    Type PotatoContract = typeof(IPotatoService);
    // Host
    this.PotatoServiceHost = new ServiceHost(typeof(PotatoService), new Uri("http://localhost:8097"));
    // Endpoint
    this.PotatoServiceHost.AddServiceEndpoint(PotatoContract, PotatoBinding, hostingAddress);
    // Behavior
    ConfigurePotatoServiceBehavior(this.PotatoServiceHost, PotatoServiceBinding);
    // Name
    this.PotatoServiceHost.Description.Name = "PotatoNamespace.PotatoService";
    //Start!
    this.PotatoServiceHost.Open();

Он компилируется и запускается, он дает мне запущенный сервис в открытом состоянии. Клиент не может найти его в своем обычном месте, и файл SVC жалуется, что у него нет ничего в web.config, и хочет получить конечную точку ServiceHasZeroAppEndpoints: «Служба имеет нулевые конечные точки приложения (не инфраструктуры)»

Я прошел по коду в отладке, и все выглядит нормально, сервис открыт, что мне не хватает, какие-нибудь советы, чтобы сузить эту проблему?

Редактировать : Получение от фабрики хостов службы работало хорошо, спасибо!

Ответы [ 3 ]

2 голосов
/ 18 июня 2010

Вы могли бы написать фабрику хоста настраиваемой службы , где вы могли бы программно настраивать службу вместо использования файла конфигурации. Затем в файле разметки .svc вы настраиваете эту пользовательскую фабрику:

<%@ServiceHost Factory="CustomFactory" Service="MyService" %>
1 голос
/ 18 июня 2010

в ApplicationStart (), это то, что правильное место, чтобы начать эту услугу в веб-приложении?

Нет. Вы не можете иметь как хостинг в среде выполнения ASP.NET, так и явный хостинг через код. Но вы можете объявить фабрику таможенного обслуживания, как описал Дарин.

не вызывает ли это отсутствие в корневом каталоге виртуального каталога?

Это не проблема.

Кроме того, могу я спросить, почему вы хотите сделать это программно? Разве не больно писать и тестировать весь этот код? Вы можете поместить свою конфигурацию WCF в отдельный файл конфигурации, если вам просто не нравится этот большой кусок конфигурации WCF в вашем файле Web.config.

Обычно служба WCF настраивается всегда одинаково. Независимо от того, размещен ли я самостоятельно или IIS, не имеет значения ServiceHost имеет реализацию по умолчанию, как строятся описание вашего сервиса и конечные точки. По умолчанию он пытается найти конфигурацию службы в файле конфигурации приложения. В вашем случае Web.config. Используемый ServiceHost абсолютно одинаков для самостоятельного хостинга и хостинга IIS.

Разница в том, как создается этот ServiceHost. При самостоятельном размещении у вас есть полный контроль, потому что вы должны создать экземпляр ServiceHost самостоятельно. В сценарии, размещенном на IIS, среда выполнения ASP.NET будет использовать ServiceHostFactory для создания экземпляра узла службы.

Итак, если вы хотите настроить ServiceHost вручную, вам нужно создать свой собственный ServiceHostFactory и сослаться на него в файле SVC.

Возвращаясь к вашим вопросам:

если я правильно понимаю, настройки в файле web.config автоматически размещают службу в aspnet_wp.exe в процессе iis

«Хостинг» просто означает, что он работает в веб-приложении. Как только вы развертываете службу как часть веб-приложения, она всегда размещается в IIS. Нет другого автономного исполняемого файла, независимо от того, как и где вы его настраиваете,

и запускается автоматически, когда клиент вызывает файл .svc?

В веб-приложении ASP.NET все запрошенные HTTP проходят через «конвейер» ASP.NET. В конвейере есть набор обработчиков, которые будут принимать и обрабатывать запрос. Для WCF это System.ServiceModel.Activation.HttpHandler. Этот обработчик, немного упрощенный, проверит, имеет ли он действительный ServiceHost и если не создаст его с помощью ServiceHostFactory. Обработчику абсолютно все равно, создаете ли вы ServiceHost в Global.asax!

Хотя, если я запускаю его с моим ServiceHost.Open () из global.axax.cs, он запускает его явно, и он не размещается в iis.

Нет. Какой бы код вы ни выполняли в своем веб-приложении, он запускается в домене приложений, размещенном в IIS.

, или все еще находится в IIS, но файл svc игнорируется?

Да. Но скорее наоборот. Ваш код Global.asax игнорируется, и активация WCF все еще пытается создать другой хост службы.

И затем здесь был предложен третий вариант: класс, производный от фабрики хостов, который будет вызываться из svc и службы, будет запускаться так же, как это было при настройках в web.config?

Это единственный вариант. Возьмите RedGates Reflector (это бесплатно) и разберите класс ServiceHostFactory. Это довольно мало. Вы увидите, что можете почти скопировать туда свой код из Global.asax, и все готово. ... и, конечно же, там должно быть много документации ...

Надеюсь, это поможет!

0 голосов
/ 20 июня 2010

Похоже, вы могли бы использовать следующий подход.

Вы можете сослаться на свой собственный файл конфигурации из веб-конфигурации.Для этой идеи, сделанной на несколько шагов дальше, взгляните на Управление строительными и промежуточными строками ASP.NET для разработки (без натяжения)

<configuration>
    <appSettings>
        <add key="ServerConfigPath" value="~/ServerConfig.config"/>
    </appSettings>
</configuration>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...