为清楚起见进行了简化。我们正在升级到Core 3,该代码在Swagger 4的Core 2.1中运行良好。
所以我有DocumentController.cs类,其中包括...
public async Task<IActionResult> GetDocument([FromRoute]GetDocument.Query model) { model.DocumentContentUrlGenerator = GenerateDocumentContentUrl; var document = await _mediator.Send(model); return Ok(document); } protected string GenerateDocumentContentUrl(int documentID) => Url.Link("GetDocumentContent", new { documentID });
...和GetDocument.cs ...
public class GetDocument { public class Query : DocumentContentUrlGeneratorRequest<DocumentResponse> { public int DocumentID { get; set; } } } public class Handler : IAsyncRequestHandler<Query, DocumentResponse> { <snip> public async Task<DocumentResponse> Handle(Query message) { var item = from d in _db.Document .Include("Topic") .Include("DocumentType") where (d.DocumentID == message.DocumentID) select new DocumentResponse(d, message.DocumentContentUrlGenerator(d.DocumentID)); return item.FirstOrDefault(); } } }
...和DocumentResponse.cs ...
public class DocumentResponse { public DocumentResponse(Models.Document document, string contentUrl = null) { <snip> } <snip> public string ContentUrl { get; set; } } public class DocumentContentUrlGeneratorRequest<T> : IRequest<T> { public Func<int, string> DocumentContentUrlGenerator { get; set; } }
这使我可以为每个文档生成一个有效的URL。
问题是Swagger 5.0.0-rc4似乎无法处理GetDocument.cs行...
DocumentContentUrlGeneratorRequest<DocumentResponse>
... Swagger页面开始出现(只是最上面的横幅),然后微调框一直坐在那里不断旋转。如果我将行更改为...
IRequest<DocumentResponse>
...它可以正常工作,但是我当然不能将URL.Link方法注入模型中。
除了Swagger解决方案以外,请考虑其他方法吗?
[编辑:]我应该指出,Core 3版本的代码确实可以使用Postman进行验证。
此外,我可以使用[ApiExplorerSettings(IgnoreApi = true)]属性来隐藏未渲染的端点,但这不是重点。