Хостинг простого сервиса Wcf в консоли

Я пытаюсь создать простой 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>

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

Система. InvalidOperationException был необработанным сообщением =, "Не удалось найти базовый адрес, который соответствует схеме http для конечной точки с привязкой MetadataExchangeHttpBinding. Зарегистрированные схемы базового адреса [net.tcp]".
Источник = "Система. ServiceModel"
StackTrace: в System. ServiceModel. ServiceHostBase. MakeAbsoluteUri (Uri relativeOrAbsoluteUri, Связывая привязку, UriSchemeKeyedCollection baseAddresses) в System. ServiceModel. Описание. ConfigLoader. LoadServiceDescription (хост ServiceHostBase, описание ServiceDescription, ServiceElement serviceElement, Действие '1 addBaseAddress) в System. ServiceModel. ServiceHostBase. LoadConfigurationSectionInternal (ConfigLoader configLoader, описание ServiceDescription, ServiceElement serviceSection) в System. ServiceModel. ServiceHostBase. LoadConfigurationSectionInternal (ConfigLoader configLoader, описание ServiceDescription, Строка configurationName) в System. ServiceModel. ServiceHostBase. ApplyConfiguration () в Системе. ServiceModel. ServiceHostBase. InitializeDescription (UriSchemeKeyedCollection baseAddresses) в System. ServiceModel. ServiceHost. InitializeDescription (Вводят serviceType, UriSchemeKeyedCollection baseAddresses) в System. ServiceModel. ServiceHost.. ctor (Вводят serviceType, Uri [] baseAddresses) в HostConsoleApplication. Программа. Основной (Строка [] args) в C:\Documents and Settings\navin.pathuru\My Documents\Visual Studio 2008\Projects\Solution2\HostConsoleApplication\Program.cs:line 13 в System. AppDomain. _ nExecuteAssembly (Блок блока, Строка [] args) в System. AppDomain. ExecuteAssembly (Представляют assemblyFile в виде строки, Доказательство assemblySecurity, Строка [] args) в Microsoft. VisualStudio. HostingProcess. HostProc. RunUsersAssembly () в Системе. Поточная обработка. ThreadHelper. ThreadStart_Context (Объектное состояние) в System. Поточная обработка. ExecutionContext. Выполненный (ExecutionContext executionContext, обратный вызов ContextCallback, Объектное состояние) в System. Поточная обработка. ThreadHelper. ThreadStart () InnerException:

Просто задавшись вопросом, если, как зафиксировать это. Спасибо N

7
задан AlliterativeAlice 15 December 2013 в 06:52
поделиться

1 ответ

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

  • у вас есть базовый адрес для 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, вы просто напрашиваетесь на неприятности некоторое время спустя.....

15
ответ дан 6 December 2019 в 14:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: