Предоставление служб 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-сервисом.
Майк