2010-01-20 6 views
0

Quelqu'un at-il avec succès en utilisant spring.nets Spring.ServiceModel.ServiceExporter avec WCF ??WCF et Spring.nets ServiceExporter

fond ..... Certains

Je suis en train de configurer les services WCF avec spring.net pour une utilisation dans une application web

Dans ma première itération du projet I en configurant le succéda un service objet avec ressort (je lui ai donné l'id requestManagerService) et dans le fichier svc I sources montrai ServiceHostFactory à cet objet. Le fichier svc ressemblait à ceci:

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

Cependant, je ne veux pas décorer mon interface/contrat avec [ServiceContract] et [OperationContract] attributs. Pour éviter cela, vous pouvez utiliser des ressorts ServiceExporter.

J'ai donc mis en place ce qui suit dans ma config web:

<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> 

Quand je lance l'application web je reçois l'erreur suivante:

« Impossible de trouver une adresse de base qui correspond à système http pour le point final avec une liaison BasicHttpBinding. schémas adresse de base sont enregistrés [] » Cette erreur se produit dans System.ServiceModel.ServiceHostBase.MakeAbsoluteUri). De toute évidence, cela implique que je dois définir une adresse de base .... mais je crois que mon problème est de configurer le printemps plutôt que WCF puisque j'utilise wcf config qui fonctionnait auparavant lorsque je n'ai pas utilisé l'exportateur.

Les docs de printemps implique configuration est simple et je suis convaincu que je fais quelque chose de fondamentalement mauvais - quelqu'un a utilisé avec succès le ServiceExporter avec une application web asp.net?

Répondre

0

Le ServiceExporter est un objet usine. Dans ce cas, il crée un objet qui enveloppe le requestManagerService et ajoute les attributs nécessaires. C'est cet objet que vous devez utiliser dans votre configuration WCF et non dans le requestManagerService d'origine.

Ainsi, afin de faire ce travail avec la configuration que vous avez montré ici, vous devez

  1. changer le nom du service dans le fichier .svc à requestManagerServiceExporter
  2. changer le nom du service dans le requestManagerServiceExporter à

Svc fichier:

<%@ 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> 

Toute autre configuration DI ou AoP, il suffit d'utiliser la requestManagerService originale.

1

Je ne sais pas si vous avez résolu votre problème, mais j'avais un semblable. Cependant, j'utilisais wsHttpBinding.Cela étant dit, en plus des recommandations BennyM, je devais retirer l'objet suivant:

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

Il est utilisé pour des applications autonomes uniquement.