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文档中?
没有内置的方法来实现这一点。 但是,它只需要几个步骤:
-
为您的子项目(从项目属性/构build)启用XML文档,就像您的Web API项目一样。 除此之外,直接将其路由到
XmlDocument.xml
以便它在您的项目的根文件夹中生成。 -
修改您的Web API项目的postbuild事件,将此XML文件复制到您的
App_Data
文件夹中:copy "$(SolutionDir)SubProject\XmlDocument.xml" "$(ProjectDir)\App_Data\Subproject.xml"
其中
Subproject.xml
应该重命名为任何您的项目名称加上.xml
。 -
接下来打开
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文件。 -
最后,通过以下方式修改
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文件夹中