113 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			113 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | // Uncomment the following to provide samples for PageResult<T>. Must also add the Microsoft.AspNet.WebApi.OData | ||
|  | // package to your project. | ||
|  | ////#define Handle_PageResultOfT | ||
|  | 
 | ||
|  | using System; | ||
|  | using System.Collections; | ||
|  | using System.Collections.Generic; | ||
|  | using System.Diagnostics; | ||
|  | using System.Diagnostics.CodeAnalysis; | ||
|  | using System.Linq; | ||
|  | using System.Net.Http.Headers; | ||
|  | using System.Reflection; | ||
|  | using System.Web; | ||
|  | using System.Web.Http; | ||
|  | #if Handle_PageResultOfT | ||
|  | using System.Web.Http.OData; | ||
|  | #endif | ||
|  | 
 | ||
|  | namespace WebAPI.Areas.HelpPage | ||
|  | { | ||
|  |     /// <summary> | ||
|  |     /// Use this class to customize the Help Page. | ||
|  |     /// For example you can set a custom <see cref="System.Web.Http.Description.IDocumentationProvider"/> to supply the documentation | ||
|  |     /// or you can provide the samples for the requests/responses. | ||
|  |     /// </summary> | ||
|  |     public static class HelpPageConfig | ||
|  |     { | ||
|  |         [SuppressMessage("Microsoft.Globalization", "CA1303:Do not pass literals as localized parameters", | ||
|  |             MessageId = "WebAPI.Areas.HelpPage.TextSample.#ctor(System.String)", | ||
|  |             Justification = "End users may choose to merge this string with existing localized resources.")] | ||
|  |         [SuppressMessage("Microsoft.Naming", "CA2204:Literals should be spelled correctly", | ||
|  |             MessageId = "bsonspec", | ||
|  |             Justification = "Part of a URI.")] | ||
|  |         public static void Register(HttpConfiguration config) | ||
|  |         { | ||
|  |             //// Uncomment the following to use the documentation from XML documentation file. | ||
|  |             config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/bin/WebAPI.xml"))); | ||
|  | 
 | ||
|  |             //// Uncomment the following to use "sample string" as the sample for all actions that have string as the body parameter or return type. | ||
|  |             //// Also, the string arrays will be used for IEnumerable<string>. The sample objects will be serialized into different media type  | ||
|  |             //// formats by the available formatters. | ||
|  |             //config.SetSampleObjects(new Dictionary<Type, object> | ||
|  |             //{ | ||
|  |             //    {typeof(string), "sample string"}, | ||
|  |             //    {typeof(IEnumerable<string>), new string[]{"sample 1", "sample 2"}} | ||
|  |             //}); | ||
|  | 
 | ||
|  |             // Extend the following to provide factories for types not handled automatically (those lacking parameterless | ||
|  |             // constructors) or for which you prefer to use non-default property values. Line below provides a fallback | ||
|  |             // since automatic handling will fail and GeneratePageResult handles only a single type. | ||
|  | #if Handle_PageResultOfT | ||
|  |             config.GetHelpPageSampleGenerator().SampleObjectFactories.Add(GeneratePageResult); | ||
|  | #endif | ||
|  | 
 | ||
|  |             // Extend the following to use a preset object directly as the sample for all actions that support a media | ||
|  |             // type, regardless of the body parameter or return type. The lines below avoid display of binary content. | ||
|  |             // The BsonMediaTypeFormatter (if available) is not used to serialize the TextSample object. | ||
|  |             config.SetSampleForMediaType( | ||
|  |                 new TextSample("Binary JSON content. See http://bsonspec.org for details."), | ||
|  |                 new MediaTypeHeaderValue("application/bson")); | ||
|  | 
 | ||
|  |             //// Uncomment the following to use "[0]=foo&[1]=bar" directly as the sample for all actions that support form URL encoded format | ||
|  |             //// and have IEnumerable<string> as the body parameter or return type. | ||
|  |             //config.SetSampleForType("[0]=foo&[1]=bar", new MediaTypeHeaderValue("application/x-www-form-urlencoded"), typeof(IEnumerable<string>)); | ||
|  | 
 | ||
|  |             //// Uncomment the following to use "1234" directly as the request sample for media type "text/plain" on the controller named "Values" | ||
|  |             //// and action named "Put". | ||
|  |             //config.SetSampleRequest("1234", new MediaTypeHeaderValue("text/plain"), "Values", "Put"); | ||
|  | 
 | ||
|  |             //// Uncomment the following to use the image on "../images/aspNetHome.png" directly as the response sample for media type "image/png" | ||
|  |             //// on the controller named "Values" and action named "Get" with parameter "id". | ||
|  |             //config.SetSampleResponse(new ImageSample("../images/aspNetHome.png"), new MediaTypeHeaderValue("image/png"), "Values", "Get", "id"); | ||
|  | 
 | ||
|  |             //// Uncomment the following to correct the sample request when the action expects an HttpRequestMessage with ObjectContent<string>. | ||
|  |             //// The sample will be generated as if the controller named "Values" and action named "Get" were having string as the body parameter. | ||
|  |             //config.SetActualRequestType(typeof(string), "Values", "Get"); | ||
|  | 
 | ||
|  |             //// Uncomment the following to correct the sample response when the action returns an HttpResponseMessage with ObjectContent<string>. | ||
|  |             //// The sample will be generated as if the controller named "Values" and action named "Post" were returning a string. | ||
|  |             //config.SetActualResponseType(typeof(string), "Values", "Post"); | ||
|  |         } | ||
|  | 
 | ||
|  | #if Handle_PageResultOfT | ||
|  |         private static object GeneratePageResult(HelpPageSampleGenerator sampleGenerator, Type type) | ||
|  |         { | ||
|  |             if (type.IsGenericType) | ||
|  |             { | ||
|  |                 Type openGenericType = type.GetGenericTypeDefinition(); | ||
|  |                 if (openGenericType == typeof(PageResult<>)) | ||
|  |                 { | ||
|  |                     // Get the T in PageResult<T> | ||
|  |                     Type[] typeParameters = type.GetGenericArguments(); | ||
|  |                     Debug.Assert(typeParameters.Length == 1); | ||
|  | 
 | ||
|  |                     // Create an enumeration to pass as the first parameter to the PageResult<T> constuctor | ||
|  |                     Type itemsType = typeof(List<>).MakeGenericType(typeParameters); | ||
|  |                     object items = sampleGenerator.GetSampleObject(itemsType); | ||
|  | 
 | ||
|  |                     // Fill in the other information needed to invoke the PageResult<T> constuctor | ||
|  |                     Type[] parameterTypes = new Type[] { itemsType, typeof(Uri), typeof(long?), }; | ||
|  |                     object[] parameters = new object[] { items, null, (long)ObjectGenerator.DefaultCollectionSize, }; | ||
|  | 
 | ||
|  |                     // Call PageResult(IEnumerable<T> items, Uri nextPageLink, long? count) constructor | ||
|  |                     ConstructorInfo constructor = type.GetConstructor(parameterTypes); | ||
|  |                     return constructor.Invoke(parameters); | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             return null; | ||
|  |         } | ||
|  | #endif | ||
|  |     } | ||
|  | } |