-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
123 changed files
with
87,369 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
using System.Web.Optimization; | ||
|
||
namespace NSwag.Sample.AspNet | ||
{ | ||
public class BundleConfig | ||
{ | ||
// For more information on bundling, visit https://go.microsoft.com/fwlink/?LinkId=301862 | ||
public static void RegisterBundles(BundleCollection bundles) | ||
{ | ||
bundles.Add(new ScriptBundle("~/bundles/jquery").Include( | ||
"~/Scripts/jquery-{version}.js")); | ||
|
||
// Use the development version of Modernizr to develop with and learn from. Then, when you're | ||
// ready for production, use the build tool at https://modernizr.com to pick only the tests you need. | ||
bundles.Add(new ScriptBundle("~/bundles/modernizr").Include( | ||
"~/Scripts/modernizr-*")); | ||
|
||
bundles.Add(new Bundle("~/bundles/bootstrap").Include( | ||
"~/Scripts/bootstrap.js")); | ||
|
||
bundles.Add(new StyleBundle("~/Content/css").Include( | ||
"~/Content/bootstrap.css", | ||
"~/Content/site.css")); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
using System.Web.Mvc; | ||
|
||
namespace NSwag.Sample.AspNet | ||
{ | ||
public class FilterConfig | ||
{ | ||
public static void RegisterGlobalFilters(GlobalFilterCollection filters) | ||
{ | ||
filters.Add(new HandleErrorAttribute()); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
using System.Web.Mvc; | ||
using System.Web.Routing; | ||
|
||
namespace NSwag.Sample.AspNet | ||
{ | ||
public class RouteConfig | ||
{ | ||
public static void RegisterRoutes(RouteCollection routes) | ||
{ | ||
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); | ||
|
||
routes.MapRoute( | ||
name: "Default", | ||
url: "{controller}/{action}/{id}", | ||
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } | ||
); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
using System.Web.Http; | ||
|
||
namespace NSwag.Sample.AspNet | ||
{ | ||
public static class WebApiConfig | ||
{ | ||
public static void Register(HttpConfiguration config) | ||
{ | ||
// Web API configuration and services | ||
|
||
// Web API routes | ||
config.MapHttpAttributeRoutes(); | ||
|
||
config.Routes.MapHttpRoute( | ||
name: "DefaultApi", | ||
routeTemplate: "api/{controller}/{id}", | ||
defaults: new { id = RouteParameter.Optional } | ||
); | ||
|
||
// Add OpenAPI/Swagger compatible routings, but not standard for .NET Framework | ||
config.Routes.MapHttpRoute( | ||
name: "DefaultApiWithAction", | ||
routeTemplate: "api/{controller}/{action}/{id}", | ||
defaults: new { id = RouteParameter.Optional } | ||
); | ||
} | ||
} | ||
} |
39 changes: 39 additions & 0 deletions
39
src/NSwag.Sample.AspNet/Areas/HelpPage/ApiDescriptionExtensions.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
using System; | ||
using System.Text; | ||
using System.Web; | ||
using System.Web.Http.Description; | ||
|
||
namespace NSwag.Sample.AspNet.Areas.HelpPage | ||
{ | ||
public static class ApiDescriptionExtensions | ||
{ | ||
/// <summary> | ||
/// Generates an URI-friendly ID for the <see cref="ApiDescription"/>. E.g. "Get-Values-id_name" instead of "GetValues/{id}?name={name}" | ||
/// </summary> | ||
/// <param name="description">The <see cref="ApiDescription"/>.</param> | ||
/// <returns>The ID as a string.</returns> | ||
public static string GetFriendlyId(this ApiDescription description) | ||
{ | ||
string path = description.RelativePath; | ||
string[] urlParts = path.Split('?'); | ||
string localPath = urlParts[0]; | ||
string queryKeyString = null; | ||
if (urlParts.Length > 1) | ||
{ | ||
string query = urlParts[1]; | ||
string[] queryKeys = HttpUtility.ParseQueryString(query).AllKeys; | ||
queryKeyString = String.Join("_", queryKeys); | ||
} | ||
|
||
StringBuilder friendlyPath = new StringBuilder(); | ||
friendlyPath.AppendFormat("{0}-{1}", | ||
description.HttpMethod.Method, | ||
localPath.Replace("/", "-").Replace("{", String.Empty).Replace("}", String.Empty)); | ||
if (queryKeyString != null) | ||
{ | ||
friendlyPath.AppendFormat("_{0}", queryKeyString.Replace('.', '-')); | ||
} | ||
return friendlyPath.ToString(); | ||
} | ||
} | ||
} |
113 changes: 113 additions & 0 deletions
113
src/NSwag.Sample.AspNet/Areas/HelpPage/App_Start/HelpPageConfig.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
// 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 NSwag.Sample.AspNet.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 = "NSwag.Sample.AspNet.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("~/App_Data/XmlDocument.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 | ||
} | ||
} |
63 changes: 63 additions & 0 deletions
63
src/NSwag.Sample.AspNet/Areas/HelpPage/Controllers/HelpController.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
using System; | ||
using System.Web.Http; | ||
using System.Web.Mvc; | ||
using NSwag.Sample.AspNet.Areas.HelpPage.ModelDescriptions; | ||
using NSwag.Sample.AspNet.Areas.HelpPage.Models; | ||
|
||
namespace NSwag.Sample.AspNet.Areas.HelpPage.Controllers | ||
{ | ||
/// <summary> | ||
/// The controller that will handle requests for the help page. | ||
/// </summary> | ||
public class HelpController : Controller | ||
{ | ||
private const string ErrorViewName = "Error"; | ||
|
||
public HelpController() | ||
: this(GlobalConfiguration.Configuration) | ||
{ | ||
} | ||
|
||
public HelpController(HttpConfiguration config) | ||
{ | ||
Configuration = config; | ||
} | ||
|
||
public HttpConfiguration Configuration { get; private set; } | ||
|
||
public ActionResult Index() | ||
{ | ||
ViewBag.DocumentationProvider = Configuration.Services.GetDocumentationProvider(); | ||
return View(Configuration.Services.GetApiExplorer().ApiDescriptions); | ||
} | ||
|
||
public ActionResult Api(string apiId) | ||
{ | ||
if (!String.IsNullOrEmpty(apiId)) | ||
{ | ||
HelpPageApiModel apiModel = Configuration.GetHelpPageApiModel(apiId); | ||
if (apiModel != null) | ||
{ | ||
return View(apiModel); | ||
} | ||
} | ||
|
||
return View(ErrorViewName); | ||
} | ||
|
||
public ActionResult ResourceModel(string modelName) | ||
{ | ||
if (!String.IsNullOrEmpty(modelName)) | ||
{ | ||
ModelDescriptionGenerator modelDescriptionGenerator = Configuration.GetModelDescriptionGenerator(); | ||
ModelDescription modelDescription; | ||
if (modelDescriptionGenerator.GeneratedModels.TryGetValue(modelName, out modelDescription)) | ||
{ | ||
return View(modelDescription); | ||
} | ||
} | ||
|
||
return View(ErrorViewName); | ||
} | ||
} | ||
} |
Oops, something went wrong.