/// <summary> /// Gets an instance of ZentityService which can handle the specified Http request. /// </summary> /// <param name="context">An instance of HttpContext containing request details.</param> /// <returns>An instance of ZentityService responsible for handling the specified request.</returns> /// <remarks>Returns null, if the ServiceFactory could not find any service /// which can handle the give request.</remarks> public static IZentityService GetServiceInstance(HttpContext context) { IZentityService service = null; string serviceType = GetServiceType(context.Request.Url); switch (serviceType) { case AtomPub: service = new AtomPubService(); break; case Sword: service = new SwordService(); break; case Pmh: service = new OaiPmhService(); break; case Ore: service = new OreService(); break; case Syndication: service = new SyndicationService(); break; default: service = null; break; } return(service); }
/// <summary> /// Handles the Http requests. /// </summary> /// <param name="context">An instance of HttpContext containing request details.</param> public void ProcessRequest(HttpContext context) { try { IZentityService service = ServiceFactory.GetServiceInstance(context); if (null == service) { context.Response.StatusCode = (int)HttpStatusCode.BadRequest; context.Response.Write(Properties.Resources.COULD_NOT_HANDLE_REQUEST); return; } string error; if (service.ValidateRequest(context, out error)) { HttpStatusCode statusCode; string responseString = service.ProcessRequest(context, out statusCode); context.Response.StatusCode = (int)statusCode; context.Response.BufferOutput = true; context.Response.Write(responseString); } else { context.Response.StatusCode = (int)HttpStatusCode.BadRequest; context.Response.Write(error); } if (context.Items.Contains("AuthenticatedToken")) { context.Items.Remove("AuthenticatedToken"); } } //We don't want to throw any error to user. instead we throw 500 (Internal server error) catch (Exception) { context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; context.Response.Write(Properties.Resources.INTERNAL_SERVER_ERROR); } }