2010-02-12 3 views
7

Я пытаюсь создать простую консольную аппликацию, в которой я хотел бы разместить простую службу wcf.Хостинг простой службы Wcf в консоли

Вот код для моего

namespace HostConsoleApplication 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (System.ServiceModel.ServiceHost host = new System.ServiceModel.ServiceHost(typeof(FirstWcfService.Service))) 
      { 
       host.Open(); 
       Console.WriteLine("Sai"); 
       Console.ReadLine(); 
      } 
     } 
    } 
} 

Затем я добавил app.config, который выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <services> 
      <service name="FirstWcfService.Service" behaviorConfiguration="ServiceBehavior"> 
       <endpoint address="FirstWcfService" binding="netTcpBinding" contract="FirstWcfService.IService"/> 
       <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" /> 
       <host> 
        <baseAddresses> 
         <add baseAddress="net.tcp://localhost:9101/"/> 
        </baseAddresses> 
       </host> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="ServiceBehavior" > 
        <serviceMetadata httpGetEnabled="false" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 
</configuration> 

Когда я запустить приложение консоли хост я получаю это исключение:

System.InvalidOperationException was unhandled Сообщение = "Не удалось найти b ase, который соответствует схеме http для конечной точки со связыванием MetadataExchangeHttpBinding. Зарегистрированные схемы базового адреса являются [net.tcp] «
Источник = "System.ServiceModel"
StackTrace:. на System.ServiceModel.ServiceHostBase.MakeAbsoluteUri (Uri relativeOrAbsoluteUri, Связывание связывания, UriSchemeKeyedCollection baseAddresses) на System.ServiceModel.Description.ConfigLoader.LoadServiceDescription (ServiceHostBase хозяина, описание ServiceDescription, ServiceElement serviceElement, Action`1 addBaseAddress) в System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal (ConfigLoader configLoader, ServiceDescription описание, ServiceElement serviceSection) на System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal (ConfigLoader configLoader, ServiceDescription описание, Строка ConfigurationName) на System.ServiceModel.ServiceHostBase.ApplyConfiguration() в System.ServiceModel.ServiceHostBase .InitializeDescription (UriSchemeKeyedCollection baseAddresses) на System.ServiceModel.ServiceHost.InitializeDescription (Тип ServiceType, UriSchemeKeyedCollection baseAddresses) в System.ServiceModel.ServiceHost..ctor (тип ServiceType, Uri [] baseAddresses) в HostConsoleApplication.Program.Main (String [] арг) в C: \ Documents и Settings \ navin.pathuru \ Мои документы \ Visual Studio 2008 \ Projects \ Solution2 \ HostConsoleApplication \ Program.cs : линия на System.AppDomain._nExecuteAssembly (Монтаж сборки, String [] арг) в System.AppDomain.ExecuteAssembly (строка assemblyFile, фактические данные assemblySecurity, String [] арг) на Microsoft.VisualStudio.HostingProcess. HostProc.RunUsersAssembly() в System.Threading.ThreadHelper.ThreadStart_Context (объект состояние) на System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback обратного вызова, объект состояния) в System.Threading.ThreadHelper.ThreadStart() InnerException:

Просто интересно, если, как это исправить. Благодаря N

+0

вам нужно, чтобы подчеркнуть ваши строки кода и XML и использовать кнопку «код» (101 010) из редактора панель инструментов, чтобы получить хорошие результаты - красиво отформатирован и синтаксис выделен! –

ответ

15

Ну, я думаю, что проблема заключается в следующем:

  • у вас есть базовый адрес для net.tcp
  • у вас есть MEX HTTP конечной точки, определенный (но не HTTP базовый адрес)

в принципе, если вы хотите использовать MEX через HTTP, вы должны предоставить либо в полный адрес для конечной точки MEX, или HTTP базового адреса (если только указать relativ e адрес).

Решение 1: указать полный адрес для конечной точки MEX:

<services> 
    <service name="FirstWcfService.Service" 
       behaviorConfiguration="ServiceBehavior"> 
     <endpoint 
      address="FirstWcfService" 
      binding="netTcpBinding" 
      contract="FirstWcfService.IService"/> 
     <endpoint 
      address="http://localhost:9102/FirstWcfService/mex" 
      binding="mexHttpBinding" 
      contract="IMetadataExchange" /> 
     ...... 
    </service> 
</services> 

Решение 2: определяют базовый адрес HTTP, тоже:

<services> 
    <service name="FirstWcfService.Service" 
       behaviorConfiguration="ServiceBehavior"> 
     <endpoint 
      address="FirstWcfService" 
      binding="netTcpBinding" 
      contract="FirstWcfService.IService"/> 
     <endpoint 
      address="mex" 
      binding="mexHttpBinding" 
      contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
       <add baseAddress="net.tcp://localhost:9101/"/> 
       <add baseAddress="http://localhost:9102/"/> 
      </baseAddresses> 
     </host> 
    </service> 
</services> 

Решение 3: вместо этого используйте mexTcpBinding

<services> 
    <service name="FirstWcfService.Service" 
       behaviorConfiguration="ServiceBehavior"> 
     <endpoint 
      address="FirstWcfService" 
      binding="netTcpBinding" 
      contract="FirstWcfService.IService"/> 
     <endpoint 
      address="mex" 
      binding="mexTcpBinding" 
      contract="IMetadataExchange" /> 
     ...... 
    </service> 
</services> 

Любой из этих трех вариантов должен решить эту проблему.

Слова предостережения: Я нахожу это весьма рискованно называть конфигурации поведения службы «ServiceBehavior» ......

<serviceBehaviors> 
    <behavior name="ServiceBehavior" > 

Моей рекомендацию: вызов вашего первым и по умолчанию в Кoнфигурировании просто «по умолчанию» (или «DefaultBehavior»)

<serviceBehaviors> 
    <behavior name="Default" > 

и начинайте выдавать другие имена, если у вас несколько конфигураций.

Вызов этого ServiceBehavior только кажется, рожон спустя некоторое время на .....

+0

Отлично, спасибо, Марк. Я добавил другое консольное приложение в качестве клиента для этого решения. Не могли бы вы рассказать мне, как использовать эту услугу в ConsoleHost. Спасибо N –

+0

Запустите свою первую консоль с помощью службы cmd.exe; затем перейдите в Visual Studio и в приложении клиентской консоли выберите «Добавить служебную ссылку» из контекстного меню Solution Explorer и введите (или вставьте) URL-адрес, в котором работает ваш сервис, - затем следует открыть эту службу и создать необходимые биты на стороне клиента, чтобы вы могли его использовать. –

Смежные вопросы