Swagger說明文檔支持手動調用Api, 可是當Api使用OAuth2受權時,因爲沒有地方能夠輸入受權Token, 致使響應結果一直是401沒有受權。api
在Swagger配置文件中,添加對請求頭中Authorization的設置。單元測試
1. 在Api項目中添加一個新類AddAuthorizationHeader並實現IOperationFilter接口測試
public class AddAuthorizationHeader : IOperationFilter { /// <summary> /// Adds an authorization header to the given operation in Swagger. /// </summary> /// <param name="operation">The Swashbuckle operation.</param> /// <param name="schemaRegistry">The Swashbuckle schema registry.</param> /// <param name="apiDescription">The Swashbuckle api description.</param> public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription) { if (operation == null) return; if (operation.parameters == null) { operation.parameters = new List<Parameter>(); } var parameter = new Parameter { description = "Token", @in = "header", name = "Authorization", required = true, type = "string" }; if (apiDescription.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any()) { //若是Api方法是容許匿名方法,Token不是必填的 parameter.required = false; } operation.parameters.Add(parameter); } }
2. 在SwaggerConfig.cs中啓用Authorization請求頭。ui
public static void Register(HttpConfiguration config) { var thisAssembly = typeof(SwaggerConfig).Assembly; config.EnableSwagger(c => { c.OperationFilter<AddAuthorizationHeader>(); c.SingleApiVersion("v1", "EHealthCareClinic.WebApi"); c.IncludeXmlComments(GetXmlCommentsPath()); }) .EnableSwaggerUi(c => { }); }
3. 編譯Api項目,從新打開Swagger說明文檔, Parameters列表中就會出現Authorization變量,錄入正確的受權Token, 401未受權問題消失。this
IHttpActionResult是Web Api 2.0引入的接口。spa
使用IHttpActionResult做爲Api 返回值的好處。3d
Swagger生成文檔的原理是經過讀取Web Api項目生成的XML文檔說明文件,使用反射技術,動態展現每一個Action方法的方法簽名。code
可是當使用IHttpActionResult做爲Api方法返回值以後,Swagger不能經過反射正確讀取到返回值的類型,因此致使生成的文檔缺乏。blog
例:接口
/// <summary> /// 獲取省份列表 /// <param name="countryId">國家ID</param> /// </summary> [HttpGet] [Route("countries/{countryId}/provinces")] public IHttpActionResult GetProvinceList(Guid countryId) { var result = QueryService.GetProvinceCollection(new CountryId(countryId)); return Ok(result); }
Web Api 2.0中引入了一個新的特性類System.Web.Http.Description.ResponseTypeAttribute。
這個特性類構造只有一個參數,即返回值的類型。
咱們只須要在每一個Api方法簽名處使用這個新特性聲明Api返回值的類型, Swagger生成的說明文檔中就會出現返回類型的說明。
/// <summary> /// 獲取省份列表 /// <param name="countryId">國家ID</param> /// </summary> [HttpGet] [Route("countries/{countryId}/provinces")] [ResponseType(typeof(IEnumerable<EHealthCareClinic.Business.QueryModel.ProvincePresentation>))] public IHttpActionResult GetProvinceList(Guid countryId) { var result = QueryService.GetProvinceCollection(new CountryId(countryId)); return Ok(result); }