麻烦的5.0.0-rc4,Core 3和向IRequest <T>

时间:2019-12-17 03:55:50

标签: c# swagger .net-core-3.0

为清楚起见进行了简化。我们正在升级到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)]属性来隐藏未渲染的端点,但这不是重点。

0 个答案:

没有答案