2012-07-31 2 views
2

J'utilise l'installation d'intégration WCF de Castle et tout fonctionne correctement pour mon premier point de terminaison webHttp. Pour que ce point de terminaison fonctionne, le paramètre WebHttpBehavior doit être activé sur le point de terminaison. J'ai pu y parvenir en utilisant:Spécification du comportement du point de terminaison de l'outil d'intégration WCF de château par point de terminaison

  container.Register(Component.For<IEndpointBehavior>() 
          .ImplementedBy<WebHttpBehavior>()); 

Cela devient un problème lorsque je tente de permettre à un deuxième point final à l'aide BasicHttpBinding qui est incompatible avec le WebHttpBehavior. Y a-t-il un moyen de spécifier que l'enregistrement IEndPointBehavior ci-dessus s'applique uniquement à un point de terminaison donné?

Ceci est mon installateur complet pour le service:

  container.AddFacility<WcfFacility>(f => f.CloseTimeout = TimeSpan.Zero) 
       .Register(Component.For<IDiagnosticService>() 
        .ImplementedBy<DiagnosticService>() 
        .Named("DiagnosticService") 
        .LifestyleTransient() 
        .AsWcfService(new DefaultServiceModel() 
            .Hosted() 
            .AddEndpoints(WcfEndpoint.BoundTo(new WebHttpBinding()).At("json")) 
            .AddEndpoints(WcfEndpoint.BoundTo(new BasicHttpBinding()).At("soap")) 
            .PublishMetadata(o => o.EnableHttpGet()))); 


      container.Register(Component.For<IEndpointBehavior>() 
          .ImplementedBy<WebHttpBehavior>()); 
+0

La classe WcfEndpoint accepte une instance de System.ServiceModel.ServiceEndpoint. En utilisant cela, je peux configurer indépendamment le point de terminaison si nécessaire. Cela semble fonctionner correctement, mais je ne peux pas comprendre comment gérer l'adressage relatif (ie (http: //local/ser.svc/json vs (http: //local/ser.svc/soap) Les constructeurs pour System.ServiceModel.EndpointAddress nécessite un URI Si je mets tout l'uri (http: //local/ser.svc/json "), j'obtiens une exception" No protocol binding match "Si j'utilise juste http: // local /ser.svc en tant qu'URI, cela fonctionne, mais je n'ai pas les adresses/json et/ou le point de terminaison soap. – Bluffrock

Répondre

3

Ok. J'ai finalement compris cela. Il s'avère que la majorité de mon problème avait à voir avec l'environnement d'émulation Azure plutôt qu'avec l'intégration WCF de Castle. La réponse est assez simple: il suffit de configurer les instances ServiceEndpoint et d'utiliser la méthode WcfEndpoint.FromEndpoint().

Voici mon installateur de travail:

 String internalEndpointAddress = string.Format("http://{0}/DiagnosticService.svc", 
              RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"].IPEndpoint); 

     // This ContractDescription instance must be used for both endpoints in this case 
     ContractDescription description = ContractDescription.GetContract(typeof(IDiagnosticService)); 

     // Create JSON webHTTP Binding    
     WebHttpBinding webhttpbinding = new WebHttpBinding(); 
     string jsonURI = internalEndpointAddress + "/json"; 
     EndpointAddress jsonEndpointAddress = new EndpointAddress(new Uri(jsonURI)); 
     ServiceEndpoint jsonEndpoint = new ServiceEndpoint(description, webhttpbinding, jsonEndpointAddress); 
     jsonEndpoint.Behaviors.Add(new WebHttpBehavior()); 


     // Create WSHTTP Binding   
     WSHttpBinding wsHttpBinding = new WSHttpBinding(); 
     string soapURI = internalEndpointAddress + "/soap"; 
     EndpointAddress soapEndpointAddress = new EndpointAddress(new Uri(soapURI)); 
     ServiceEndpoint soapEndpoint = new ServiceEndpoint(description, wsHttpBinding, soapEndpointAddress); 



     container.AddFacility<WcfFacility>(f => f.CloseTimeout = TimeSpan.Zero) 
       .Register(Component.For<IDiagnosticService>() 
        .ImplementedBy<DiagnosticService>() 
        .Named("DiagnosticService") 
        .LifestyleTransient() 
        .AsWcfService(new DefaultServiceModel() 
            .Hosted() 
            .AddEndpoints(WcfEndpoint.FromEndpoint(jsonEndpoint)) 
            .AddEndpoints(WcfEndpoint.FromEndpoint(soapEndpoint)) 
            .PublishMetadata(o => o.EnableHttpGet()))); 
Questions connexes