Предоставление служб WCF через HTTP, если они не размещены в IIS

Как следует из заголовка, нам нужно настроить службы WCF между приложением.NET и приложением Adobe AIR. Мы не хотим запускать IIS на компьютере и предпочитаем устанавливать и запускать службы WCF, размещенные в службе Windows.

Однако я не уверен в том, что это позволит нам использовать HTTP в качестве транспорта, работает ли это только в IIS? Я смог настроить вещи для использования транспорта TCP, но это не так хорошо взаимодействует с AIR, как использование HTTP.

РЕДАКТИРОВАТЬ: тестовый код, который я использовал, чтобы увидеть, работает ли это:

Обычное консольное приложение:

    static void Main()
    {
        using (ServiceHost host = new ServiceHost(typeof(TestService)))
        {
            host.Open();
        }

        Console.WriteLine("Waiting...");
        Console.ReadLine();
    }

TestService - это простой сервис типа HelloWorld.

В App.Config:

<configuration>
  <system.serviceModel>
    <services>
      <service name="WCFExample2.TestService" behaviorConfiguration="WCFExample2.TestServiceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8731/Design_Time_Addresses/WCFExample2/Service1/" />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- Unless fully qualified, address is relative to base address supplied above -->
        <endpoint address ="" binding="wsHttpBinding" contract="WCFExample2.ITestService">
          <!-- 
              Upon deployment, the following identity element should be removed or replaced to reflect the 
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
              automatically.
          -->
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <!-- Metadata Endpoints -->
        <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --> 
        <!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WCFExample2.TestServiceBehavior">
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

3 ответа

Решение

Помимо настроек конфигурационного файла еще одна вещь, которую следует учитывать. Если вы самостоятельно размещены в службе Windows, тогда конечной точкой http

  • Сделать учетную запись службы локальным администратором на машине или
  • Вы должны зарегистрировать учетную запись службы для пространства имен http с помощью http.sys. Этот шаг должен быть сделан локальным администратором, но только один раз на каждой машине. Вы можете использовать инструмент HttpSysCfg, чтобы сделать это в XP/win 2003. Для Vista/ Win 2008 используйте netsh.

У вас не должно возникнуть проблем при настройке службы Windows NT, в которой размещается ваша служба WCF и предоставляются конечные точки HTTP - нет необходимости в IIS (но среда выполнения WCF будет использовать драйвер режима ядра http.sys).

Вы пытались и потерпели неудачу? Если так - можете ли вы показать нам, что у вас было, и как и где это не удалось?

Как минимум, вы, вероятно, захотите иметь что-то вроде этого конфига на стороне службы:

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="Default">
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <basicHttpBinding>
        <binding name="Default" 
                 sendTimeout="00:05:00" 
                 maxBufferSize="500000" 
                 maxReceivedMessageSize="500000" >
          <security mode="Message">
            <message clientCredentialType="UserName" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="Namespace.MyWCFService"
               behaviorConfiguration="Default">
        <host>
          <baseAddresses>
            <add baseAddress="http://MyServer:8282/MyWCFService/"/>
          </baseAddresses>
        </host>
        <endpoint
             address="basic"
             binding="basicHttpBinding" bindingConfiguration="Default"
             contract="Namespace.IMyWCFService" />
      </service>
    </services>
  </system.serviceModel>

Конечно, вам может понадобиться настроить такие параметры, как настройки тайм-аута, настройки размера буфера и т. Д. В привязке, режим безопасности и, возможно, другие параметры, как вам нужно.

Марк

Вы можете пропустить всю конфигурацию и использовать класс WebServiceHost (который сделает все это за вас довольно стандартным способом). Получите эту работу, а затем посмотрите на настройку конфигурации вручную, чтобы удовлетворить любые дополнительные требования, которые могут у вас возникнуть. Вся необходимая информация находится здесь. WebServiceHost на MSDN. Это очень простой способ начать работу с пользовательским (т. Е. Не IIS) размещенным http-сервисом.

Майк

Другие вопросы по тегам