日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁(yè)編程開發(fā)C#.NET → 模擬IIS向Silverlight輸出策略文件

      模擬IIS向Silverlight輸出策略文件

      前往專題相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:本站整理時(shí)間:2010/9/13 23:33:32字體大。A-A+

      作者:佚名點(diǎn)擊:152次評(píng)論:0次標(biāo)簽: IIS Silverlight

      • 類型:站長(zhǎng)工具大。92KB語(yǔ)言:中文 評(píng)分:5.0
      • 標(biāo)簽:
      立即下載

      最近的Silverlight開發(fā)中,由于部分需求對(duì)實(shí)時(shí)性和數(shù)據(jù)量下載速度有要求,部分WCF服務(wù)配置成了netTcpBinding,這種方式跟普通的service.svc寄宿IIS不同的是,Silverlight需要的策略文件需要放置在本機(jī)IIS的根下,也就是wwwroot文件夾下,以滿足Silverlight在以TCP協(xié)議調(diào)用本機(jī)WCF服務(wù)時(shí)請(qǐng)求策略文件。

      (注:Silverlight通過(guò)TCP協(xié)議調(diào)用WCF服務(wù)時(shí),會(huì)以http方式請(qǐng)求主機(jī)的一個(gè)策略文件,地址是http://localhost/clientaccesspolicy.xml)

      這其實(shí)是個(gè)不太好的選擇,程序運(yùn)行的所需的環(huán)境被分成了兩部分,同事的機(jī)器上并未安裝IIS,為了大家開發(fā)簡(jiǎn)便,不用在額外安裝IIS,也為了讓程序更加獨(dú)立,我就想能不能寫代碼監(jiān)控80端口模擬IIS向Silverlight輸出這個(gè)策略文件。

      解決方法

      有了這個(gè)想法之后,首先想到的是通過(guò)Socket進(jìn)行監(jiān)聽,因?yàn)榇饲霸贛SDN上看到過(guò)這種方式,但很無(wú)奈,將代碼轉(zhuǎn)移過(guò)來(lái)之后,并未成功。相信做過(guò)Silverlight在Socket方面應(yīng)用的朋友對(duì)下面這個(gè)PolicyServer類很熟悉吧。

      using System;
      using System.IO;
      using System.Net;
      using System.Net.Sockets;

      namespace PolicyServer
      {
      // Encapsulate and manage state for a single connection from a client
      class PolicyConnection
      {
          private Socket m_connection;

          // buffer to receive the request from the client
          private byte[] m_buffer;
          private int m_received;

          // the policy to return to the client
          private byte[] m_policy;

          // the request that we're expecting from the client
          private static string s_policyRequestString = "<policy-file-request/>";



          public PolicyConnection(Socket client, byte[] policy)
          {
              m_connection = client;
              m_policy = policy;

              m_buffer = new byte[s_policyRequestString.Length];
              m_received = 0;

              try
              {
                  // receive the request from the client
                  m_connection.BeginReceive(m_buffer, 0, s_policyRequestString.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
              }
              catch (SocketException)
              {
                  m_connection.Close();
              }
          }

          // Called when we receive data from the client
          private void OnReceive(IAsyncResult res)
          {
              try
              {
                  m_received += m_connection.EndReceive(res);

                  // if we haven't gotten enough for a full request yet, receive again
                  if (m_received < s_policyRequestString.Length)
                  {
                      m_connection.BeginReceive(m_buffer, m_received, s_policyRequestString.Length - m_received, SocketFlags.None, new AsyncCallback(OnReceive), null);
                      return;
                  }

                  // make sure the request is valid
                  string request = System.Text.Encoding.UTF8.GetString(m_buffer, 0, m_received);
                  if (StringComparer.InvariantCultureIgnoreCase.Compare(request, s_policyRequestString) != 0)
                  {
                      m_connection.Close();
                      return;
                  }

                  // send the policy
                  m_connection.BeginSend(m_policy, 0, m_policy.Length, SocketFlags.None, new AsyncCallback(OnSend), null);
              }
              catch (SocketException)
              {
                  m_connection.Close();
              }
          }

          // called after sending the policy to the client; close the connection.
          public void OnSend(IAsyncResult res)
          {
              try
              {
                  m_connection.EndSend(res);
              }
              finally
              {
                  m_connection.Close();
              }
          }
      }

      // Listens for connections on port 943 and dispatches requests to a PolicyConnection
      class PolicyServer
      {
          private Socket m_listener;
          private byte[] m_policy;

          // pass in the path of an XML file containing the socket policy
          public PolicyServer(string policyFile)
          {
              // Load the policy file
              FileStream policyStream = new FileStream(policyFile, FileMode.Open);

              m_policy = new byte[policyStream.Length];
              policyStream.Read(m_policy, 0, m_policy.Length);

              policyStream.Close();

              m_listener = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);

              m_listener.SetSocketOption(SocketOptionLevel.IPv6, (SocketOptionName)27, 0);

              m_listener.Bind(new IPEndPoint(IPAddress.IPv6Any, 943));
              m_listener.Listen(10);

              m_listener.BeginAccept(new AsyncCallback(OnConnection), null);
          }

           public void OnConnection(IAsyncResult res)
          {
              Socket client = null;

              try
              {
                  client = m_listener.EndAccept(res);
              }
              catch (SocketException)
              {
                  return;
              }

              // handle this policy request with a PolicyConnection
              PolicyConnection pc = new PolicyConnection(client, m_policy);

              // look for more connections
              m_listener.BeginAccept(new AsyncCallback(OnConnection), null);
          }

          public void Close()
          {
              m_listener.Close();
          }
      }
      public class Program
      {
          static void Main(string[] args)
          {
              if (args.Length == 0)
              {
                  Console.WriteLine("usage: PolicyServer.exe PolicyFile.xml");
                  return;
              }

              PolicyServer ps = new PolicyServer(args[0]);
              System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
          }
      }
      }
        此路不通之后,又想起使用HttpListener類,看看是否能夠監(jiān)聽http請(qǐng)求,果然能夠截獲HTTP的請(qǐng)求 HttpListener listener = new HttpListener(); listener.Prefixes.Add(http://localhost/); listener.Start();Console.WriteLine("開始監(jiān)聽…"); HttpListenerContext context = listener.GetContext(); HttpListenerRequest request = context.Request; HttpListenerResponse response = context.Response; 但是這種方式有個(gè)明顯的缺點(diǎn),就是線程是阻塞的。于是,又想到使用線程池。 System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(Listen)); private static void Listen(object state) { while (httpListener.IsListening) { httpListener.BeginGetContext(new AsyncCallback(ListenerCallback), httpListener); listenForNextRequest.WaitOne(); } }

      這樣的話,每接收一個(gè)請(qǐng)求便會(huì)異步處理這個(gè)請(qǐng)求。在請(qǐng)求的處理上,接收請(qǐng)求后需要向外輸出策略文件流,供silverlight端接收驗(yàn)證。

      using(System.Net.HttpListenerResponse response = context.Response)

      { System.Threading.Thread.Sleep(1000); string responseString = "<?xml version=\"1.0\" encoding=\"utf-8\"?> " + " <access-policy> " + " <cross-domain-access> " + " <policy> " + " <allow-from http-request-headers=\"*\">" + " <domain uri=\"*\" /> " + " </allow-from> " + " <grant-to> " + " <socket-resource port=\"4502-4534\" protocol=\"tcp\" /> " + " </grant-to> " + " </policy> " + " </cross-domain-access>" + " </access-policy>"; byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString); response.ContentLength64 = buffer.LongLength; response.OutputStream.Write(buffer, 0, buffer.Length); }

      啟動(dòng)這個(gè)模擬服務(wù),將clientaccesspolicy從wwwroot中移除后再運(yùn)行一下程序,OK,我們不再需要將策略文件放到IIS下了。

      注意:如果你的機(jī)器裝了IIS,請(qǐng)還是放一個(gè)策略文件到wwwroot吧,否則就停掉IIS再使用這個(gè)類,因?yàn)镮IS和這個(gè)類只能有一方監(jiān)聽80端口。

        相關(guān)評(píng)論

        閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過(guò)難過(guò)
        • 5 囧
        • 3 圍觀圍觀
        • 2 無(wú)聊無(wú)聊

        熱門評(píng)論

        最新評(píng)論

        發(fā)表評(píng)論 查看所有評(píng)論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)