WCF и Spring.nets ServiceExporter

Кто-нибудь успешно использует spring.nets Spring.ServiceModel.ServiceExporter с WCF??

Какой-то фон.....

Я пытаюсь настроить службы wcf с помощью spring.net для использования в веб-приложении.

В моей первой итерации проекта мне удалось настроить объект службы с помощью spring (я дал ему идентификатор requestManagerService), а в файле svc я указал Springs ServiceHostFactory на этот объект. SVC-файл выглядел так:

<%@ ServiceHost Language="C#" Debug="true" Service="requestManagerService" Factory="Spring.ServiceModel.Activation.ServiceHostFactory" %>

Однако я не хочу украшать свой интерфейс/контракт атрибутами [ServiceContract] и [OperationContract]. Чтобы избежать этого, вы можете использовать Springs ServiceExporter.

Итак, я установил следующее в своей веб-конфигурации:

<object id="requestManagerService" type="SupplyAndDemand.Messaging.UI.Web.RequestManagerService, SupplyAndDemand.Messaging.UI.Web"
        singleton="false">
      </object>

 <system.serviceModel>
    <services>
      <service name="requestManagerService" behaviorConfiguration="DefaultBehavior">
        <endpoint address="" binding="basicHttpBinding" contract="SupplyAndDemand.Shared.Interfaces.Services.IRequestManagerService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="DefaultBehavior">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

<object id="requestManagerServiceHost" type="Spring.ServiceModel.Activation.ServiceHostFactoryObject, Spring.Services">
   <property name="TargetName" value="requestManagerServiceExporter" />
</object>

  <object id="requestManagerServiceExporter" type="Spring.ServiceModel.ServiceExporter, Spring.Services">
    <!-- The target object to export-->
    <property name="TargetName" value="requestManagerService"/>
    <!-- The namespace associated with the wcf service-->
    <property name="Namespace" value="http://supplyanddemandapp/"/>
    <property name="TypeAttributes">
      <list>
        <object type="System.ServiceModel.ServiceBehaviorAttribute, System.ServiceModel">
          <property name="ConfigurationName" value="requestManagerService"/>
        </object>
      </list>
    </property>
  </object>

Когда я запускаю веб-приложение, я получаю следующую ошибку:

«Не удалось найти базовый адрес, соответствующий схеме http для конечной точки с привязкой BasicHTTPBinding. Зарегистрированные схемы базовых адресов: []». Эта ошибка возникает в System.ServiceModel.ServiceHostBase.MakeAbsoluteUri).

Очевидно, это означает, что мне нужно определить базовый адрес.... но я считаю, что моя проблема заключается в настройке spring, а не WCF, поскольку я использую конфигурацию wcf, которая ранее работала, когда я не использовал экспортер.

Документы Spring подразумевают, что конфигурация проста, и я убежден, что делаю что-то принципиально неправильное - кто-нибудь успешно использовал ServiceExporter с веб-приложением asp.net?


person iasksillyquestions    schedule 20.01.2010    source источник


Ответы (2)


Не уверен, что вы решили свою проблему, но у меня была похожая. Однако я использовал wsHttpBinding. При этом, в дополнение к рекомендациям BennyM, мне пришлось удалить следующий объект:

<object id="requestManagerServiceHost"     type="Spring.ServiceModel.Activation.ServiceHostFactoryObject, Spring.Services">
   <property name="TargetName" value="requestManagerServiceExporter" />
</object>

Он используется только для автономных приложений.

person user2774187    schedule 18.09.2013

ServiceExporter является фабричным объектом. В этом случае он создаст объект, который обертывает requestManagerService и добавит необходимые атрибуты. Именно этот объект вам нужно использовать в конфигурации WCF, а не оригинальный requestManagerService.

Итак, чтобы это работало с показанной здесь конфигурацией, вам нужно

  1. измените имя службы в файле .svc на requestManagerServiceExporter
  2. изменить имя службы в requestManagerServiceExporter

SVC-файл:

<%@ ServiceHost Language="C#" Debug="true" Service="requestManagerServiceExporter" Factory="Spring.ServiceModel.Activation.ServiceHostFactory" %>

Web.config:

<system.serviceModel>
    <services>
        <service name="requestManagerServiceExporter" behaviorConfiguration="DefaultBehavior">
        <endpoint address="" binding="basicHttpBinding" contract="SupplyAndDemand.Shared.Interfaces.Services.IRequestManagerService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="DefaultBehavior">
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Любая другая конфигурация DI или AoP, просто используйте оригинальный requestManagerService.

person BennyM    schedule 24.01.2010