我们在尝试访问文档时遇到问题。我们目前在Webforms Web应用程序中托管了一个WebAPI2项目,该项目近一年来一直运行良好。我们正在使用Swashbuckle 5.2.2,但我确实更新了当前版本,看它是否能解决这个问题。它并没有巧妙地修复这个问题所以它现在又回到了5.2.2,因为我们即将发布。
几周前,文档突然在尝试打开时抛出异常。到目前为止我们能够收集的唯一信息是以下输出到浏览器的信息:
<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>Object reference not set to an instance of an object.</ExceptionMessage>
<ExceptionType>System.NullReferenceException</ExceptionType>
<StackTrace> at ᜄ.ᜀ.<>c.ᜀ(Task`1 A_0)
at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.Cors.CorsMessageHandler.<SendAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Web.Http.HttpServer.<SendAsync>d__0.MoveNext()
</StackTrace>
</Error>
我们已经确定了它停止工作的构建,并检查了触发构建的代码提交。但是,WebAPI项目根本没有提交,除了主Web应用程序中的某些CSS之外没有其他任何提交,这些CSS不会影响Swagger文档。
我们比较了两个版本之间的Web应用程序文件夹,除了次要CSS差异之外的唯一区别是重新编译的项目程序集。每个构建都是从源代码控制中新建的。
我已经检查了WebAPI2项目程序集,并且在两个版本中都正确嵌入了自定义swagger资源文件(图像,html和css文件)。
这是我们的SwaggerConfig内容(一些识别名称已更改):
const string webApiXmlDocFileName = "WebAPI2.xml";
const string modelXmlDocFileName = "Core.xml";
GlobalConfiguration.Configuration
.EnableSwagger("api/docs/{apiVersion}", c =>
{
c.IgnoreObsoleteActions();
c.IgnoreObsoleteProperties();
c.DescribeAllEnumsAsStrings();
c.IncludeXmlComments(webApiXmlDocFileName);
c.IncludeXmlComments(modelXmlDocFileName);
c.DocumentFilter<AlphabeticSortOperationFilter>();
c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
c.SingleApiVersion("v1", "API Reference");
c.Schemes(new[] { "http", "https" });
c.OAuth2("oauth2")
.Description("OAuth2 Implicit Grant")
.TokenUrl("/api/oauth2/token")
.Flow("password")
.Scopes(scopes =>
{
scopes.Add("clientid", "try out simple api");
});
c.OperationFilter<AddAuthorizationHeaderParameterOperationFilter>();
})
.EnableSwaggerUi("api/docs/ui/{*assetPath}", c =>
{
// Specify our custom templates isntead of defaults
c.InjectStylesheet(Assembly.GetExecutingAssembly(), "WebAPI2.SwashbuckleExtensions.index.css");
c.CustomAsset("index", Assembly.GetExecutingAssembly(), "WebAPI2.SwashbuckleExtensions.index.html");
c.CustomAsset("logo", Assembly.GetExecutingAssembly(), "WebAPI2.SwashbuckleExtensions.Logo-white.png");
c.EnableOAuth2Support("clientid", "realm", "project");
c.DisableValidator();
});
我们没有在日志中获得任何内容,并且遍历我们的所有代码都不会在我们的结尾处暴露错误。
有没有人对如何进一步深入研究?我们在这里有点茫然,因为我们无法捕获请求路由中的错误来源。任何帮助将不胜感激。
修改 我终于找到了一些可能会对这个问题有所了解的信息。
我们在我们的应用程序中使用第三方控件,它看起来像主机自己的WebAPI实例,以便处理自己的RESTful调用。当在webapp初始化期间调用他们的特定方法时,会发生上述错误。我已经联系过他们,看看是否需要这个电话会议,或者说这个电话会有什么后果。
问题在于,有没有办法让Swashbuckle完全忽略一个程序集或类?由于它是第三方,我们无法修改它以添加自定义属性,并且使用过滤器将无法正常工作,因为此时已经抛出异常。
答案 0 :(得分:0)
不确定这是否是您遇到的情况,但是我遇到了相同的System.NullReferenceException:'对象引用未设置为对象的实例。'
foreach( apiExplorer.ApiDescriptions 中的变量组):
c.MultipleApiVersions(
(apiDescription, version) => apiDescription.GetGroupName() == version,
info =>
{
foreach (var group in apiExplorer.ApiDescriptions)
{
var description = ....
通过逐行消除添加的结论,得出结论,我在API Controller操作中的[Route]属性中犯了一个错误。 我没有使用'/'
关闭路线所以,这没用
[Route("templateFields/{templateFieldId:int}/inputtype")]
但这有效
[Route(“ templateFields / {templateFieldId:int} / inputtype /”)]-不是末尾的/ 。
那引起了异常!