Advertisement
auto98179871624

WCF BasicHttpBinding Programmatically

Feb 24th, 2013
528
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.68 KB | None | 0 0
  1. // see http://stackoverflow.com/questions/15050641/
  2. using System;
  3. using System.IO;
  4. using System.Net;
  5. using System.Security.Cryptography.X509Certificates;
  6. using System.ServiceModel;
  7. using System.ServiceModel.Description;
  8. using System.ServiceModel.Security;
  9. using System.ServiceModel.Web;
  10. using System.Text;
  11.  
  12. namespace ServerConsole
  13. {
  14.     internal class Program
  15.     {
  16.         public enum Server
  17.         {
  18.             None,
  19.             Basic,
  20.             Secure
  21.         }
  22.  
  23.         private static readonly Uri UriBase = new Uri("http://localhost:8080/");
  24.         private static readonly Uri UriBaseService = new Uri("http://localhost:8080/Basic");
  25.  
  26.         private static readonly Uri UriSecure = new Uri("https://localhost:8081/");
  27.         private static readonly Uri UriSecureService = new Uri("https://localhost:8081/Secure");
  28.  
  29.         private static ServiceHost _serviceHost;
  30.         private static ServiceHost _serviceHostSecure;
  31.  
  32.         private static void Main(string[] args)
  33.         {
  34.             ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;
  35.  
  36.             Logger.Log(Server.Basic, "Start");
  37.             BasicHTTPServer();
  38.  
  39.             Logger.Log(Server.Secure, "Start");
  40.             SecureHTTPServer();
  41.  
  42.             Console.ReadKey();
  43.  
  44.             _serviceHost.Close();
  45.         }
  46.  
  47.         private static void SecureHTTPServer()
  48.         {
  49.             var binding = new BasicHttpBinding();
  50.             binding.Name = "binding2";
  51.             binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
  52.             binding.Security.Mode = BasicHttpSecurityMode.Transport;
  53.             binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
  54.  
  55.             // Create a ServiceHost for the CalculatorService type and provide the base address.
  56.             _serviceHostSecure = new ServiceHost(typeof (ServiceBasic), UriSecure);
  57.             _serviceHostSecure.Credentials.ServiceCertificate.Certificate = GetCertificate();
  58.                 //load a certificate from file
  59.             _serviceHostSecure.Credentials.ClientCertificate.Authentication.CertificateValidationMode =
  60.                 X509CertificateValidationMode.None;
  61.  
  62.             _serviceHostSecure.AddServiceEndpoint(typeof (IServiceBasic), binding, UriSecureService);
  63.             var webHttpBinding = new WebHttpBinding(WebHttpSecurityMode.Transport);
  64.             webHttpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
  65.  
  66.             _serviceHostSecure.AddServiceEndpoint(typeof (IPolicyRetriever), webHttpBinding, "")
  67.                               .Behaviors.Add(new WebHttpBehavior());
  68.             var smb = new ServiceMetadataBehavior {HttpsGetEnabled = true, HttpsGetUrl = UriSecure};
  69.             _serviceHostSecure.Description.Behaviors.Add(smb);
  70.  
  71.             // Open the ServiceHostBase to create listeners and start listening for messages.
  72.             _serviceHostSecure.Open();
  73.             Logger.Log(Server.Basic, string.Format("Open at {0} Service: {1}", UriSecure, UriSecureService));
  74.         }
  75.  
  76.         private static X509Certificate2 GetCertificate()
  77.         {
  78.             var x509Certificate2 = new X509Certificate2("Server.pfx");
  79.             Logger.Log(Server.Secure,
  80.                        string.Format("Get X509Certificate2:{0}{1}", Environment.NewLine, x509Certificate2));
  81.             return x509Certificate2;
  82.         }
  83.  
  84.         private static void BasicHTTPServer()
  85.         {
  86.             var binding = new BasicHttpBinding();
  87.             binding.Name = "binding1";
  88.             binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
  89.             binding.Security.Mode = BasicHttpSecurityMode.None;
  90.  
  91.             // Create a ServiceHost for the CalculatorService type and provide the base address.
  92.             _serviceHost = new ServiceHost(typeof (ServiceBasic), UriBase);
  93.  
  94.             _serviceHost.AddServiceEndpoint(typeof (IServiceBasic), binding, UriBaseService);
  95.             _serviceHost.AddServiceEndpoint(typeof (IPolicyRetriever), new WebHttpBinding(), "")
  96.                         .Behaviors.Add(new WebHttpBehavior());
  97.             var smb = new ServiceMetadataBehavior {HttpGetEnabled = true, HttpGetUrl = UriBase};
  98.             _serviceHost.Description.Behaviors.Add(smb);
  99.  
  100.             // Open the ServiceHostBase to create listeners and start listening for messages.
  101.             _serviceHost.Open();
  102.             Logger.Log(Server.Basic, string.Format("Open at {0} Service: {1}", UriBase, UriBaseService));
  103.         }
  104.     }
  105.  
  106.     //[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
  107.     internal class ServiceBasic : IServiceBasic, IPolicyRetriever
  108.     {
  109.         public Stream GetSilverlightPolicy()
  110.         {
  111.             Logger.Log(Program.Server.None, "PolicyRetriever - GetSilverlightPolicy");
  112.             string result = @"<?xml version=""1.0"" encoding=""utf-8""?>
  113. <access-policy>
  114.    <cross-domain-access>
  115.        <policy>
  116.            <allow-from http-request-headers=""*"">
  117.                <domain uri=""*""/>
  118.            </allow-from>
  119.            <grant-to>
  120.                <resource path=""/"" include-subpaths=""true""/>
  121.            </grant-to>
  122.        </policy>
  123.    </cross-domain-access>
  124. </access-policy>";
  125.             return StringToStream(result);
  126.         }
  127.  
  128.         public Stream GetFlashPolicy()
  129.         {
  130.             Logger.Log(Program.Server.None, "PolicyRetriever - GetFlashPolicy");
  131.             string result = @"<?xml version=""1.0""?>
  132. <!DOCTYPE cross-domain-policy SYSTEM ""http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"">
  133. <cross-domain-policy>
  134.    <allow-access-from domain=""*"" />
  135. </cross-domain-policy>";
  136.             return StringToStream(result);
  137.         }
  138.  
  139.         public string TestMethod(string testMessage)
  140.         {
  141.             Logger.Log(Program.Server.Basic, "TestMethod called with: " + testMessage);
  142.  
  143.             return testMessage;
  144.         }
  145.  
  146.         private Stream StringToStream(string result)
  147.         {
  148.             WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml";
  149.             return new MemoryStream(Encoding.UTF8.GetBytes(result));
  150.         }
  151.     }
  152.  
  153.     [ServiceContract]
  154.     internal interface IServiceBasic
  155.     {
  156.         [OperationContract]
  157.         string TestMethod(string testMessage);
  158.     }
  159.  
  160.     [ServiceContract]
  161.     public interface IPolicyRetriever
  162.     {
  163.         [OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")]
  164.         Stream GetSilverlightPolicy();
  165.  
  166.         [OperationContract, WebGet(UriTemplate = "/crossdomain.xml")]
  167.         Stream GetFlashPolicy();
  168.     }
  169. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement