Web Api的Xml文档如何包含主项目之外的文档?

将XmlDoc集成到Web Api项目中的文档似乎只处理所有APItypes都是WebApi项目的一部分的情况。 具体来说,它讨论了如何将XML文档重新路由到App_Data/XmlDocument.xml并取消注释将使用该文件的configuration文件中的行。 这隐含地只允许一个项目的文档文件。

但是,在我的设置中,我有我的请求和响应types在一个共同的“模型”项目中定义。 这意味着如果我有一个定义的端点如:

 [Route("auth/openid/login")] public async Task<AuthenticationResponse> Login(OpenIdLoginRequest request) { ... } 

其中OpenIdLoginRequest在单独的C#项目中定义如下:

 public class OpenIdLoginRequest { /// <summary> /// Represents the OpenId provider that authenticated the user. (ie Facebook, Google, etc.) /// </summary> [Required] public string Provider { get; set; } ... } 

尽pipe有XML文档,但查看特定于端点的帮助页面(例如http://localhost/Help/Api/POST-auth-openid-login )时, request参数的属性不包含任何文档。

我怎样才能使XML文档的子项目中的types出现在Web API XML文档中?

没有内置的方法来实现这一点。 但是,它只需要几个步骤:

  1. 为您的子项目(从项目属性/构build)启用XML文档,就像您的Web API项目一样。 除此之外,直接将其路由到XmlDocument.xml以便它在您的项目的根文件夹中生成。

  2. 修改您的Web API项目的postbuild事件,将此XML文件复制到您的App_Data文件夹中:

     copy "$(SolutionDir)SubProject\XmlDocument.xml" "$(ProjectDir)\App_Data\Subproject.xml" 

    其中Subproject.xml应该重命名为任何您的项目名称加上.xml

  3. 接下来打开Areas\HelpPage\HelpPageConfig并find以下行:

     config.SetDocumentationProvider(new XmlDocumentationProvider( HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml"))); 

    这是您最初取消注释的行,以便首先启用XML帮助文档。 将该行replace为:

     config.SetDocumentationProvider(new XmlDocumentationProvider( HttpContext.Current.Server.MapPath("~/App_Data"))); 

    这一步确保XmlDocumentationProvider被传递到包含您的XML文件的目录,而不是您项目的特定XML文件。

  4. 最后,通过以下方式修改Areas\HelpPage\XmlDocumentationProvider

    一个。 将_documentNavigator字段replace为:

     private List<XPathNavigator> _documentNavigators = new List<XPathNavigator>(); 

    湾 将构造函数replace为:

     public XmlDocumentationProvider(string appDataPath) { if (appDataPath == null) { throw new ArgumentNullException("appDataPath"); } var files = new[] { "XmlDocument.xml", "Subproject.xml" }; foreach (var file in files) { XPathDocument xpath = new XPathDocument(Path.Combine(appDataPath, file)); _documentNavigators.Add(xpath.CreateNavigator()); } } 

    C。 在构造函数下面添加下面的方法:

     private XPathNavigator SelectSingleNode(string selectExpression) { foreach (var navigator in _documentNavigators) { var propertyNode = navigator.SelectSingleNode(selectExpression); if (propertyNode != null) return propertyNode; } return null; } 

    d。 最后,修复所有编译器错误(应该有三个),导致对_documentNavigator.SelectSingleNode引用,并删除_documentNavigator. 部分,以便它现在调用我们上面定义的新的SelectSingleNode方法。

这最后一步是修改文档提供程序以支持在多个XML文档中查找帮助文本,而不仅仅是主要项目。

现在,当您查看帮助文档时,它将包含来自相关项目types的XML文档。

我也遇到了这个问题,但我不想编辑或复制任何生成的代码,以避免以后的问题。

基于其他答案,下面是一个用于多个XML源的自包含文档提供程序。 把这个放到你的项目中:

 /// <summary>A custom <see cref="IDocumentationProvider"/> that reads the API documentation from a collection of XML documentation files.</summary> public class MultiXmlDocumentationProvider : IDocumentationProvider, IModelDocumentationProvider { /********* ** Properties *********/ /// <summary>The internal documentation providers for specific files.</summary> private readonly XmlDocumentationProvider[] Providers; /********* ** Public methods *********/ /// <summary>Construct an instance.</summary> /// <param name="paths">The physical paths to the XML documents.</param> public MultiXmlDocumentationProvider(params string[] paths) { this.Providers = paths.Select(p => new XmlDocumentationProvider(p)).ToArray(); } /// <summary>Gets the documentation for a subject.</summary> /// <param name="subject">The subject to document.</param> public string GetDocumentation(MemberInfo subject) { return this.GetFirstMatch(p => p.GetDocumentation(subject)); } /// <summary>Gets the documentation for a subject.</summary> /// <param name="subject">The subject to document.</param> public string GetDocumentation(Type subject) { return this.GetFirstMatch(p => p.GetDocumentation(subject)); } /// <summary>Gets the documentation for a subject.</summary> /// <param name="subject">The subject to document.</param> public string GetDocumentation(HttpControllerDescriptor subject) { return this.GetFirstMatch(p => p.GetDocumentation(subject)); } /// <summary>Gets the documentation for a subject.</summary> /// <param name="subject">The subject to document.</param> public string GetDocumentation(HttpActionDescriptor subject) { return this.GetFirstMatch(p => p.GetDocumentation(subject)); } /// <summary>Gets the documentation for a subject.</summary> /// <param name="subject">The subject to document.</param> public string GetDocumentation(HttpParameterDescriptor subject) { return this.GetFirstMatch(p => p.GetDocumentation(subject)); } /// <summary>Gets the documentation for a subject.</summary> /// <param name="subject">The subject to document.</param> public string GetResponseDocumentation(HttpActionDescriptor subject) { return this.GetFirstMatch(p => p.GetDocumentation(subject)); } /********* ** Private methods *********/ /// <summary>Get the first valid result from the collection of XML documentation providers.</summary> /// <param name="expr">The method to invoke.</param> private string GetFirstMatch(Func<XmlDocumentationProvider, string> expr) { return this.Providers .Select(expr) .FirstOrDefault(p => !String.IsNullOrWhiteSpace(p)); } } 

…并在您的HelpPageConfig使用所需XML文档的path启用它:

 config.SetDocumentationProvider(new MultiXmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/Api.xml"), HttpContext.Current.Server.MapPath("~/App_Data/Api.Models.xml"))); 

另一个简化的方法是合并xml文件。 下面的回复中的代码示例:

Web Api帮助页面来自多个文件的XML注释

在这里我提供了一个答案链接,它可以帮助你。 您可以轻松地使用多个XML文件进行文档。

Web Api帮助页面来自多个文件的XML注释

解决这个问题最简单的方法是在你部署的服务器上创buildApp_Code文件夹。 然后将您在bin文件夹中的XmlDocument.xml本地复制到App_Code文件夹中