방법: 사용자 지정 정책 어설션 내보내기
정책 어설션은 서비스 끝점의 기능 및 요구 사항에 대해 설명합니다. 서비스 응용 프로그램은 서비스 메타데이터에서 사용자 지정 정책 어설션을 사용하여 끝점, 바인딩 또는 계약 사용자 지정 정보에 대해 클라이언트 응용 프로그램과 통신할 수 있습니다. WCF(Windows Communication Foundation)를 사용하여 통신 중인 기능이나 요구 사항에 따라 끝점, 작업 또는 메시지 제목의 WSDL 바인딩에 연결된 정책 식으로 어설션을 내보낼 수 있습니다.
사용자 지정 정책 어설션은 System.ServiceModel.Channels.BindingElement의 System.ServiceModel.Description.IPolicyExportExtension 인터페이스를 구현하고, 바인딩 요소를 서비스 끝점의 바인딩에 직접 삽입하거나 바인딩 요소를 응용 프로그램 구성 파일에 등록하여 내보냅니다. 정책 내보내기 구현을 통해 사용자 지정 정책 어설션을 System.Xml.XmlElement 인스턴스로서 ExportPolicy 메서드에 전달된 System.ServiceModel.Description.PolicyConversionContext의 해당 System.ServiceModel.Description.PolicyAssertionCollection에 추가해야 합니다.
또한 WsdlExporter 클래스의 PolicyVersion 속성을 확인하고, 지정된 정책 버전에 따라 올바른 네임스페이스의 중첩된 정책 식 및 정책 프레임워크 특성을 내보내야 합니다.
사용자 지정 정책 어설션을 가져오려면 System.ServiceModel.Description.IPolicyImportExtension 및 방법: 사용자 지정 정책 어설션 가져오기를 참조하십시오.
사용자 지정 정책 어설션을 내보내려면
System.ServiceModel.Channels.BindingElement의 System.ServiceModel.Description.IPolicyExportExtension 인터페이스를 구현합니다. 다음 코드 예제에서는 바인딩 수준에서 사용자 지정 정책 어설션의 구현을 보여 줍니다.
#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
#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
바인딩 요소를 끝점 바인딩에 프로그래밍 방식으로 삽입하거나 응용 프로그램 구성 파일을 사용하여 삽입합니다. 다음 절차를 참조하십시오.
응용 프로그램 구성 파일을 사용하여 바인딩 요소를 삽입하려면
사용자 지정 정책 어설션 바인딩 요소에 대한 System.ServiceModel.Configuration.BindingElementExtensionElement를 구현합니다.
<bindingElementExtensions> 요소를 사용하는 구성 파일에 바인딩 요소 확장을 추가합니다.
System.ServiceModel.Channels.CustomBinding을 사용하여 사용자 지정 바인딩을 만듭니다.
바인딩 요소를 프로그래밍 방식으로 삽입하려면
새 System.ServiceModel.Channels.BindingElement를 만들어 System.ServiceModel.Channels.CustomBinding에 추가합니다.
1단계의 사용자 지정 바인딩을 새 끝점에 추가하고, AddServiceEndpoint 메서드를 호출하여 해당 새 서비스 끝점을 System.ServiceModel.ServiceHost에 추가합니다.
ServiceHost를 엽니다. 다음 코드 예제에서는 사용자 지정 바인딩을 만들고 프로그래밍 방식으로 바인딩 요소를 삽입하는 방법에 대해 보여 줍니다.
Dim baseAddress As New Uri("https://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("https://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
Uri baseAddress = new Uri("https://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("https://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(); }