Размещение простого сервиса Wcf в консоли - PullRequest
7 голосов
/ 12 февраля 2010

Я пытаюсь создать простое приложение ConsoleApplication, в котором я хотел бы разместить простой сервис 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 было необработанное сообщение = "Не удалось найти базовый адрес, соответствующий схеме http для конечной точки с привязкой MetadataExchangeHttpBinding. Схемы зарегистрированных базовых адресов [Net.tcp] ".
Источник = "System.ServiceModel"
Трассировки стека: в System.ServiceModel.ServiceHostBase.MakeAbsoluteUri (Uri lativeOrAbsoluteUri, Binding привязка, UriSchemeKeyedCollection baseAddresses) в System.ServiceModel.Description.ConfigLoader.LoadServiceDescription (ServiceHostBase хост, описание ServiceDescription, СервисЭлемент СервисЭлемент, Action`1 addBaseAddress) в System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal (ConfigLoader configLoader, ServiceDescription описание, ServiceElement serviceSection) в System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal (ConfigLoader configLoader, ServiceDescription описание, строковое имя_конфигурации) в System.ServiceModel.ServiceHostBase.ApplyConfiguration () в System.ServiceModel.ServiceHostBase.InitializeDescription (UriSchemeKeyedCollection baseAddresses) в System.ServiceModel.ServiceHost.InitializeDescription (Тип serviceType, UriSchemeKeyedCollection baseAddresses) в System.ServiceModel.ServiceHost..ctor (Тип serviceType, Uri [] baseAddresses) at HostConsoleApplication.Program.Main (String [] args) в C: \ Documents and Настройки \ navin.pathuru \ Мои Документы \ Visual Studio 2008 \ Projects \ Solution2 \ HostConsoleApplication \ Program.cs: линии 13 в System.AppDomain._nExecuteAssembly (Assembly сборка, строка [] args) в System.AppDomain.ExecuteAssembly (String AssemblyFile, Доказательства AssemblySecurity, String [] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly () в System.Threading.ThreadHelper.ThreadStart_Context (Object государство) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, ContextCallback обратный вызов, состояние объекта) в System.Threading.ThreadHelper.ThreadStart () InnerException:

Просто интересно, как это исправить. Спасибо N

1 Ответ

15 голосов
/ 12 февраля 2010

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

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

В основном, если вы хотите использовать MEX поверх http, вам необходимо указать либо полный адрес для конечной точки MEX, либо базовый адрес http (если вы указываете только относительный адрес).

Решение 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" >

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

<serviceBehaviors>
    <behavior name="Default" >

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

Вызывая это ServiceBehavior, похоже, через некоторое время возникают проблемы .....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...