Guest User

http://stackoverflow.com question 7986429

a guest
Nov 7th, 2011
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.99 KB | None | 0 0
  1.  
  2.     public delegate void RequestCompleteHandler(HPCRequest request);
  3.  
  4.     public class HPCRequest : BindingObjectBase
  5.     {
  6.         #region Events
  7.         public RequestCompleteHandler RequestComplete;
  8.         #endregion
  9.  
  10.         #region Protected Properties
  11.         protected readonly RequestState State;
  12.         private readonly string hpcServer;
  13.         private readonly string hpcRequestString;
  14.         protected string hpcRequestParameters = string.Empty;
  15.         private delegate void HTTPDelegate();
  16.         private delegate void CompletedDelegate(RequestState state);
  17.         #endregion
  18.  
  19.         #region Public Properties
  20.         public HPCRequestEnum HPCFunction { get; private set; }
  21.         public string RequestPath
  22.         {
  23.             get
  24.             {
  25.                 return String.Concat(hpcServer, "/", hpcRequestString, hpcRequestParameters);
  26.             }
  27.         }
  28.         public int RequestTimeout = 60000;
  29.         public bool ResponseOK { get; set; }
  30.         public string HPCResponse { get { return State.Content; } }
  31.         public string FormattedResponse { get; protected set; }
  32.         #endregion
  33.  
  34.         #region Constructor
  35.         protected HPCRequest(HPCRequestEnum functionType)
  36.         {
  37.             HPCFunction = functionType;
  38.             hpcRequestString = HPCFunction.RequestString();
  39.  
  40.             State = new RequestState(this);
  41.             hpcServer = ((MUSUI.App)App.Current).HPCServer;
  42.         }
  43.         #endregion
  44.  
  45.         #region Public Methods
  46.         public void SendRequest()
  47.         {
  48.             string request = String.Concat(hpcServer, "/", hpcRequestString, hpcRequestParameters);
  49.             System.Diagnostics.Debug.WriteLine("SendRequest: " + request);
  50.             HttpModule.SendRequest(request, RequestTimeout, State);
  51.  
  52.             if( App.Current != null )
  53.                 App.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new CompletedDelegate(ResponseReceived), State);    
  54.         }
  55.  
  56.         public void SendRequestAsync()
  57.         {
  58.             Thread thread = new Thread( new ThreadStart( new HTTPDelegate(SendRequest) ));
  59.             thread.Start();
  60.         }
  61.         #endregion Public Methods
  62.  
  63.         #region Private Methods
  64.         private void ResponseReceived(RequestState state)
  65.         {
  66.             ResponseOK = state.HTTPStatus == HttpStatusCode.OK;
  67.             System.Diagnostics.Debug.WriteLine(String.Concat("ResponseReceived: ", hpcServer, "/", hpcRequestString, hpcRequestParameters));
  68.             System.Diagnostics.Debug.WriteLine(String.Concat("HTTPStatus: ", state.HTTPStatus));
  69.             System.Diagnostics.Debug.WriteLine(String.Concat("Content: ", state.Content));
  70.             FormattedResponse = state.Content;
  71.             OnRequestComplete(state);
  72.         }
  73.  
  74.         protected virtual void OnRequestComplete(RequestState state)
  75.         {
  76.             if (RequestComplete != null)
  77.             {
  78.                 RequestComplete(this);            
  79.             }
  80.             InvokePropertyChanged("Content");
  81.             InvokePropertyChanged("State");
  82.         }
  83.         #endregion Private Methods
  84.     }
  85.  
  86.  
  87.     public sealed class HPCGetConfig : HPCRequest
  88.     {
  89.         private string[] referencePortfolioIDs;
  90.         private string[] simGridIDs;
  91.  
  92.         public string[] ReferencePortfolioIDs { get { return referencePortfolioIDs; } }
  93.         public string[] SimGridIDs { get { return simGridIDs; } }
  94.  
  95.         public HPCGetConfig() : base(HPCRequestEnum.HPCGetConfig) { }
  96.  
  97.         protected sealed override void OnRequestComplete(RequestState state)
  98.         {
  99.             if (ResponseOK)
  100.             {
  101.                 referencePortfolioIDs = state.extractContentValue("ReferencePortfolioIds").Split('|');
  102.                 simGridIDs = state.extractContentValue("SimGridIds").Split('|');
  103.                 InvokePropertyChanged("ReferencePortfolioIDs");
  104.                 InvokePropertyChanged("SimGridIDs");
  105.             }
  106.             base.OnRequestComplete(state);
  107.         }
  108.     }
  109.  
  110.     public class Tester
  111.     {
  112.        
  113.         void GetConfigCommand_Execute()
  114.         {
  115.             HPCGetConfig request = new HPCGetConfig();
  116.             request.RequestComplete += new RequestCompleteHandler(HPCGetConfig_RequestComplete);
  117.             request.SendRequestAsync();
  118.         }
  119.  
  120.         void HPCGetConfig_RequestComplete(HPCRequest req)
  121.         {
  122.             HPCGetConfig request = (HPCGetConfig) req;
  123.             request.RequestComplete -= HPCGetConfig_RequestComplete;
  124.  
  125.             if (request.ResponseOK)
  126.             {
  127.                 System.Diagnostics.Debug.Assert(request.SimGridIDs.Length > 0)
  128.             }
  129.             else
  130.             {
  131.                 //...
  132.             }
  133.         }
  134.     }
  135.  
  136.  
  137. ///INCLUDED SO THE CODE COMPILES
  138.  
  139.     public static class HttpModule
  140.     {
  141.         public static RequestState SendRequest(string uri, int timeout, RequestState state)
  142.         {
  143.             HttpWebRequest _WebRequest;
  144.             HttpWebResponse _WebResponse;
  145.             HttpStatusCode status = HttpStatusCode.ServiceUnavailable;
  146.             string content = string.Empty;
  147.  
  148.             try
  149.             {
  150.                 _WebRequest = CreateWebRequest(new Uri(uri), new NameValueCollection(), "GET");
  151.                 _WebRequest.UserAgent = "MUS " + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version;
  152.                 _WebRequest.Timeout = timeout;
  153.                 _WebResponse = (HttpWebResponse)_WebRequest.GetResponse();
  154.          
  155.                 status = _WebResponse.StatusCode;
  156.                 content = GetContentFromResponse(_WebResponse);
  157.             }
  158.             catch (WebException ex)
  159.             {
  160.                 if (ex.Response != null)
  161.                 {
  162.                     status = ((HttpWebResponse)ex.Response).StatusCode;
  163.                     content = string.Concat(status.ToString(), "\r\n", GetContentFromResponse(((HttpWebResponse)ex.Response)));
  164.                 }
  165.                 else
  166.                 {
  167.                     status = ex.Status == WebExceptionStatus.Timeout ? HttpStatusCode.RequestTimeout : HttpStatusCode.BadRequest;
  168.                     content = ex.Message;
  169.                 }
  170.             }
  171.             catch (Exception ex)
  172.             {
  173.                 status = HttpStatusCode.BadRequest;
  174.                 content = ex.Message;
  175.             }
  176.  
  177.             state.Content = content;
  178.             state.HTTPStatus = status;
  179.             return state;
  180.         }
  181.  
  182.         public static string GetContentFromResponse(HttpWebResponse response)
  183.         {
  184.             Encoding enc = System.Text.Encoding.GetEncoding(1252);
  185.             StreamReader stream = new StreamReader(response.GetResponseStream(), enc);
  186.             string content = stream.ReadToEnd();
  187.             stream.Close();
  188.  
  189.             return content;
  190.         }
  191.  
  192.         public static void CancelRequest(HttpWebRequest WebRequest)
  193.         {
  194.             WebRequest.Abort();
  195.         }
  196.  
  197.         public static HttpWebRequest CreateWebRequest(Uri uri, NameValueCollection collHeader, string RequestMethod)
  198.         {
  199.             HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
  200.             webrequest.KeepAlive = false;
  201.             webrequest.Method = RequestMethod;
  202.  
  203.             int iCount = collHeader.Count;
  204.             string key;
  205.             string keyvalue;
  206.  
  207.             for (int i = 0; i < iCount; i++)
  208.             {
  209.                 key = collHeader.Keys[i];
  210.                 keyvalue = collHeader[i];
  211.                 webrequest.Headers.Add(key, keyvalue);
  212.             }
  213.  
  214.             webrequest.ContentType = "application/x-www-form-urlencoded";
  215.             webrequest.Accept = "text/plain";
  216.             webrequest.AllowAutoRedirect = false;
  217.             webrequest.Credentials = CredentialCache.DefaultNetworkCredentials;
  218.             collHeader.Clear();
  219.  
  220.             return webrequest;
  221.         }
  222.     }
  223.  
  224.     public class RequestState
  225.     {
  226.         #region Private Properties
  227.         protected HPCRequest Parent { get; private set; }
  228.         private string _Content;
  229.         private HttpStatusCode _HTTPStatus;
  230.         private bool Content_set = false;
  231.         private bool HTTPStatus_set = false;
  232.         #endregion
  233.  
  234.         #region Public Properties
  235.         public string Content
  236.         {
  237.             get { return _Content;  }
  238.             set
  239.             {
  240.                 if (!Content_set)
  241.                     _Content = value;
  242.                 else
  243.                     throw new Exception("This class only allows the response content to be set once.");
  244.             }
  245.         }
  246.         public HttpStatusCode HTTPStatus
  247.         {
  248.             get { return _HTTPStatus; }
  249.             set
  250.             {
  251.                 if (!HTTPStatus_set)
  252.                     _HTTPStatus = value;
  253.                 else
  254.                     throw new Exception("This class only allows the response status to be set once.");
  255.             }
  256.         }
  257.         public HPCRequestEnum HPCFunction { get { return Parent.HPCFunction; } }
  258.         #endregion Public Properties
  259.  
  260.         #region Constructors
  261.         public RequestState(HPCRequest parent)
  262.         {
  263.             Parent = parent;
  264.         }
  265.         #endregion Constructors
  266.  
  267.  
  268.         public string extractContentValue(string key)
  269.         {
  270.             int sPos = Content.IndexOf(key + "=");
  271.             if (sPos != -1)
  272.             {
  273.                 int len = key.Length + 1;
  274.                 int ePos = Content.IndexOf('&', sPos + len);
  275.                 if (ePos == -1)
  276.                     return Content.Substring(sPos + len);
  277.                 else
  278.                     return Content.Substring(sPos + len, ePos - (sPos + len));
  279.             }
  280.             else
  281.                 throw new MissingFieldException("Response field '" + key + "' not found.");
  282.         }
  283.     }
  284.  
  285.  
  286.     public enum HPCRequestEnum
  287.     {
  288.         NotSet = 0, HPCGetConfig, HPCCreate, HPCRun, HPCGetStatus, HPCGetMarginals, HPCGetExpectedLosses, HPCGetReinstatements, HPCGetRetroCosts, HPCGetROETrialLosses, HPCDestroy
  289.     }
  290.  
  291.     public static class HPCRequestEnumExtensions
  292.     {
  293.         public static string RequestString(this HPCRequestEnum HPCFunction)
  294.         {
  295.             switch (HPCFunction)
  296.             {
  297.                 case HPCRequestEnum.HPCGetConfig: return "GetConfig";
  298.                 case HPCRequestEnum.HPCCreate: return "Create";
  299.                 case HPCRequestEnum.HPCRun: return "Run";
  300.                 case HPCRequestEnum.HPCGetStatus: return "GetStatus";
  301.                 case HPCRequestEnum.HPCGetMarginals: return "GetMarginals";
  302.                 case HPCRequestEnum.HPCGetExpectedLosses: return "GetExpectedLosses";
  303.                 case HPCRequestEnum.HPCGetReinstatements: return "GetExpectedReinstatements";
  304.                 case HPCRequestEnum.HPCGetRetroCosts: return "GetRetroCosts";
  305.                 case HPCRequestEnum.HPCGetROETrialLosses: return "GetROETrialLosses";
  306.                 case HPCRequestEnum.HPCDestroy: return "Destroy";
  307.                 default: return string.Empty;
  308.             }
  309.         }
  310.     }
  311.  
  312.  
Add Comment
Please, Sign In to add comment