Specifying Castle WCF Integration Facility Endpoint Behavior per Endpoint

隐身守侯 提交于 2019-12-12 20:12:43

问题


I'm using Castle WCF Integration Facility and I have everything working properly for my first webHttp endpoint. For this endpoint to work, it requires that the endpoint have the WebHttpBehavior enabled. I was able to achieve this using:

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

This becomes a problem when I try to enable a second endpoint using BasicHttpBinding which is not compatible with the WebHttpBehavior.

Is there someway to specify that the IEndPointBehavior registration above is only applicable to a certain endpoint?

This is my full installer for the 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>());

回答1:


Ok. I finally figured this out. Turns out that the majority of my problem had to do with the Azure emulation environment rather than Castle WCF Integration. The answer is pretty straight forward -- just setup the ServiceEndpoint instances and use the WcfEndpoint.FromEndpoint() method.

Here is my working installer:

        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())));


来源:https://stackoverflow.com/questions/11749693/specifying-castle-wcf-integration-facility-endpoint-behavior-per-endpoint

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!