방법: 사용자 지정 정책 어설션 내보내기
정책 어설션은 서비스 엔드포인트의 기능 및 요구 사항에 대해 설명합니다. 서비스 애플리케이션은 서비스 메타데이터에서 사용자 지정 정책 어설션을 사용하여 엔드포인트, 바인딩 또는 계약 사용자 지정 정보에 대해 클라이언트 애플리케이션과 통신할 수 있습니다. WCF(Windows Communication Foundation)를 사용하여 통신 중인 기능이나 요구 사항에 따라 엔드포인트, 작업 또는 메시지 제목에서 WSDL 바인딩에 연결된 정책 식의 어설션을 내보낼 수 있습니다.
사용자 지정 정책 어설션은 System.ServiceModel.Description.IPolicyExportExtension의 System.ServiceModel.Channels.BindingElement 인터페이스를 구현하고, 바인딩 요소를 서비스 엔드포인트의 바인딩에 직접 삽입하거나 바인딩 요소를 애플리케이션 구성 파일에 등록하여 내보냅니다. 정책 내보내기 구현을 통해 사용자 지정 정책 어설션을 System.Xml.XmlElement 인스턴스로서 System.ServiceModel.Description.PolicyAssertionCollection 메서드에 전달된 System.ServiceModel.Description.PolicyConversionContext의 해당 ExportPolicy에 추가해야 합니다.
또한 PolicyVersion 클래스의 WsdlExporter 속성을 확인하고, 지정된 정책 버전에 따라 올바른 네임스페이스의 중첩된 정책 식 및 정책 프레임워크 특성을 내보내야 합니다.
사용자 지정 정책 어설션을 가져오려면 System.ServiceModel.Description.IPolicyImportExtension 및 방법: 사용자 지정 정책 어설션 가져오기를 참조하세요.
사용자 지정 정책 어설션을 내보내려면
System.ServiceModel.Description.IPolicyExportExtension의 System.ServiceModel.Channels.BindingElement 인터페이스를 구현합니다. 다음 코드 예제에서는 바인딩 수준에서 사용자 지정 정책 어설션의 구현을 보여 줍니다.
#region IPolicyExporter Members public void ExportPolicy(MetadataExporter exporter, PolicyConversionContext policyContext) { if (exporter == null) throw new NullReferenceException("The MetadataExporter object passed to the ExporterBindingElement is null."); if (policyContext == null) throw new NullReferenceException("The PolicyConversionContext object passed to the ExporterBindingElement is null."); XmlElement elem = doc.CreateElement(name1, ns1); elem.InnerText = "My custom text."; XmlAttribute att = doc.CreateAttribute("MyCustomAttribute", ns1); att.Value = "ExampleValue"; elem.Attributes.Append(att); XmlElement subElement = doc.CreateElement("MyCustomSubElement", ns1); subElement.InnerText = "Custom Subelement Text."; elem.AppendChild(subElement); policyContext.GetBindingAssertions().Add(elem); Console.WriteLine("The custom policy exporter was called."); } #endregion
#Region "IPolicyExporter Members" Public Sub ExportPolicy(ByVal exporter As MetadataExporter, ByVal policyContext As PolicyConversionContext) Implements IPolicyExportExtension.ExportPolicy If exporter Is Nothing Then Throw New NullReferenceException("The MetadataExporter object passed to the ExporterBindingElement is null.") End If If policyContext Is Nothing Then Throw New NullReferenceException("The PolicyConversionContext object passed to the ExporterBindingElement is null.") End If Dim elem As XmlElement = doc.CreateElement(name1, ns1) elem.InnerText = "My custom text." Dim att As XmlAttribute = doc.CreateAttribute("MyCustomAttribute", ns1) att.Value = "ExampleValue" elem.Attributes.Append(att) Dim subElement As XmlElement = doc.CreateElement("MyCustomSubElement", ns1) subElement.InnerText = "Custom Subelement Text." elem.AppendChild(subElement) policyContext.GetBindingAssertions().Add(elem) Console.WriteLine("The custom policy exporter was called.") End Sub #End Region
바인딩 요소를 엔드포인트 바인딩에 프로그래밍 방식으로 삽입하거나 애플리케이션 구성 파일을 사용하여 삽입합니다. 다음 절차를 참조하십시오.
애플리케이션 구성 파일을 사용하여 바인딩 요소를 삽입하려면
사용자 지정 정책 어설션 바인딩 요소에 대한 System.ServiceModel.Configuration.BindingElementExtensionElement를 구현합니다.
<bindingElementExtensions> 요소를 사용하여 구성 파일에 바인딩 요소 확장을 추가합니다.
System.ServiceModel.Channels.CustomBinding을 사용하여 사용자 지정 바인딩을 만듭니다.
바인딩 요소를 프로그래밍 방식으로 삽입하려면
새 System.ServiceModel.Channels.BindingElement를 만들어 System.ServiceModel.Channels.CustomBinding에 추가합니다.
1단계의 사용자 지정 바인딩을 새 엔드포인트에 추가하고, System.ServiceModel.ServiceHost 메서드를 호출하여 해당 새 서비스 엔드포인트를 AddServiceEndpoint에 추가합니다.
ServiceHost 파일을 엽니다. 다음 코드 예제에서는 사용자 지정 바인딩을 만들고 프로그래밍 방식으로 바인딩 요소를 삽입하는 방법에 대해 보여 줍니다.
Uri baseAddress = new Uri("http://localhost:8000/servicemodelsamples/service"); // Create a ServiceHost for the CalculatorService type and provide the base address. using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress)) { // Create a custom binding that contains two binding elements. ReliableSessionBindingElement reliableSession = new ReliableSessionBindingElement(); reliableSession.Ordered = true; HttpTransportBindingElement httpTransport = new HttpTransportBindingElement(); httpTransport.AuthenticationScheme = System.Net.AuthenticationSchemes.Anonymous; httpTransport.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard; CustomBinding binding = new CustomBinding(reliableSession, httpTransport); // Add an endpoint using that binding. serviceHost.AddServiceEndpoint(typeof(ICalculator), binding, ""); // Add a MEX endpoint. ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; smb.HttpGetUrl = new Uri("http://localhost:8001/servicemodelsamples"); serviceHost.Description.Behaviors.Add(smb); // Open the ServiceHostBase to create listeners and start listening for messages. serviceHost.Open(); // The service can now be accessed. Console.WriteLine("The service is ready."); Console.WriteLine("Press <ENTER> to terminate service."); Console.WriteLine(); Console.ReadLine(); // Close the ServiceHostBase to shutdown the service. serviceHost.Close(); }
Dim baseAddress As New Uri("http://localhost:8000/servicemodelsamples/service") ' Create a ServiceHost for the CalculatorService type and provide the base address. Using serviceHost As New ServiceHost(GetType(CalculatorService), baseAddress) ' Create a custom binding that contains two binding elements. Dim reliableSession As New ReliableSessionBindingElement() reliableSession.Ordered = True Dim httpTransport As New HttpTransportBindingElement() httpTransport.AuthenticationScheme = System.Net.AuthenticationSchemes.Anonymous httpTransport.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard Dim binding As New CustomBinding(reliableSession, httpTransport) ' Add an endpoint using that binding. serviceHost.AddServiceEndpoint(GetType(ICalculator), binding, "") ' Add a MEX endpoint. Dim smb As New ServiceMetadataBehavior() smb.HttpGetEnabled = True smb.HttpGetUrl = New Uri("http://localhost:8001/servicemodelsamples") serviceHost.Description.Behaviors.Add(smb) ' Open the ServiceHostBase to create listeners and start listening for messages. serviceHost.Open() ' The service can now be accessed. Console.WriteLine("The service is ready.") Console.WriteLine("Press <ENTER> to terminate service.") Console.WriteLine() Console.ReadLine() ' Close the ServiceHostBase to shutdown the service. serviceHost.Close() End Using