如何为Asp.Net MVC生成文档?

如何解决如何为Asp.Net MVC生成文档?

| 使用.net 4.0 / Preview工具包2,我们可以为WCF REST生成帮助页面。 无论如何,我们可以为MVC做同样的事情吗? www.somewebsite.com/search/help 我可以创建帮助页面(视图)并公开它们。 我可以生成XSD架构并以xml格式吐出。 还有其他指导/建议吗? 我想生成与此类似的东西。 UriTemplate http://somewebsite.com/Search/ 方法PUT 响应格式Xml 响应架构http://somewebsite.com/help/response/schema 响应示例http://somewebsite.com/help/response/example 更新: 我可以使用以下代码创建文档。
Route : somewebsite.com/Media/
HelpRoute : somewebsite.com/Media/Help (Append help to the parent route)

Add routes accordingly. See below example.

routes.MapRoute(\"Search\",\"Search/Quick/\",new { controller = \"Search\",action = \"Search\" },new { httpMethod = new HttpMethodConstraint(\"PUT\") }
           );

        routes.MapRoute(\"SearchHelp\",\"Search/Quick/Help\",new { helpConstraint = new HelpConstraint { Help = true,SampleType = typeof(Search) } }
          );

 public class HelpResult : ViewResult
{
    private string HelpPage { get; set; }
    private string folderName = \"HelpFiles\";
    private HttpServerUtilityBase server { get; set; }
    private Type sampleType { get; set; }
    private string schemaName { get; set; }

    const string htmlFormat =
          @\"
        <html>
        <head>
            <title>Help</title>
        </head>
        <body>         

        <li>URL - {0}</li>
        <li>Verb - {1}</li>
        {2}

        </body>
        </html>  
        \";

    public override void ExecuteResult(ControllerContext context)
    {
        server = context.HttpContext.Server;
        StringBuilder parentUrl = new StringBuilder();
        var data = context.RouteData.Route.GetRouteData(context.HttpContext);

        //Getting requested route url.
        string url = ((Route)(data.Route)).Url;

        //Getting parent route from requested route url by removing \"Help\" from the route.
        string newUrl = url.Substring(0,url.Length - 4);
        parentUrl.Append(\"/\" + newUrl);

        sampleType = data.GetSampleType();
        var validVerbs = GetValidVerbs(MakeAppRelative(parentUrl.ToString()));
        CreateSchema(sampleType,true);
        HelpPage = string.Format(htmlFormat,newUrl,validVerbs,CreateInputSampleText());
        context.HttpContext.Response.Output.Write(HelpPage);
    }

    private string CreateInputSampleText()
    {
        if (sampleType != null && !string.IsNullOrEmpty(sampleType.Name))
        {
            string sampleText =
                @\"<li>Input Sample Xml - <a href=\'\\HelpFiles\\{0}.xml\'>Click Here</a></li>           
        <li>Input Sample Json - <a href=\'\\HelpFiles\\{0}.txt\'>Click Here</a></li>
        <li>Input Schema - <a href=\'\\HelpFiles\\{1}\'>Click Here</a></li>\";
            sampleText = string.Format(sampleText,sampleType.Name,schemaName);
            return sampleText;
        }

        return string.Empty;
    }

    private static string MakeAppRelative(string url)
    {
        if (!url.StartsWith(\"~\"))
        {
            if (!url.StartsWith(\"/\"))
                url = \"~/\" + url;
            else
                url = \"~\" + url;
        }
        return url;
    }

    private static string GetValidVerbs(string Url)
    {
        StringBuilder validVerbs = new StringBuilder();
        var httpMethodoptions = new[] { \"GET\",\"POST\",\"PUT\",\"DELETE\",\"HEAD\" };
        foreach (var httpMethodoption in httpMethodoptions)
        {
            var fakeContext = new FakeHttpContext(MakeAppRelative(Url),httpMethodoption);
            foreach (Route route in RouteTable.Routes)
            {
                var rd = route.GetRouteData(fakeContext);
                if (rd != null)
                {
                    bool errorControllerApplied = route.IsErrorController();
                    if (!errorControllerApplied)
                    {
                        validVerbs.Append(httpMethodoption);
                    }
                }
            }
        }

        return validVerbs.ToString();
    }

    private void CreateFile(Type type,Stream stream)
    {
        using (Stream inputStream = stream)
        {
            schemaName = sampleType + \"Schema.xml\";
            string folder = Path.GetFullPath(Path.Combine(server.MapPath(\"~\"),folderName));
            string file = Path.Combine(folder,schemaName);
            if (!Directory.Exists(folder))
                Directory.CreateDirectory(folder);

            using (FileStream fileStream = new FileStream(file,FileMode.Create))
            {
                byte[] fileContent = new byte[inputStream.Length];
                inputStream.Read(fileContent,fileContent.Length);
                fileStream.Write(fileContent,fileContent.Length);
                fileStream.Flush();
            }
        }
    }

    private void CreateSchema(Type type,bool isXmlSerializerType)
    {
        System.Collections.IEnumerable schemas;
        if (isXmlSerializerType)
        {
            XmlReflectionImporter importer = new XmlReflectionImporter();
            XmlTypeMapping typeMapping = importer.ImportTypeMapping(type);
            XmlSchemas s = new XmlSchemas();
            XmlSchemaExporter exporter = new XmlSchemaExporter(s);
            exporter.ExportTypeMapping(typeMapping);
            schemas = s.GetSchemas(null);
        }
        else
        {
            XsdDataContractExporter exporter = new XsdDataContractExporter();
            exporter.Export(type);
            schemas = exporter.Schemas.Schemas();
        }
        using (MemoryStream stream = new MemoryStream())
        {
            XmlWriterSettings xws = new XmlWriterSettings() { Indent = true };
            using (XmlWriter w = XmlWriter.Create(stream,xws))
            {
                w.WriteStartElement(\"Schemas\");
                foreach (XmlSchema schema in schemas)
                {
                    if (schema.TargetNamespace != \"http://www.w3.org/2001/XMLSchema\")
                    {
                        schema.Write(w);
                    }
                }
            }
            stream.Seek(0,SeekOrigin.Begin);
            CreateFile(type,stream);
        }
    }
 public static class RouteDataExtensions
{
    public static bool IsHelpConstraintApplied(this RouteData data)
    {
        if (data != null && data.Route != null)
        {
            var constraints = ((Route) (data.Route)).Constraints;
            var helpConstraint = (from c in constraints.Values
                                  where c.GetType().Equals(typeof (HelpConstraint))
                                  select c).FirstOrDefault();
            if (helpConstraint != null)
            {
                return true;
            }
        }

        return false;
    }

    public static Type GetSampleType(this RouteData data)
    {
        if (data != null && data.Route != null)
        {
            var constraints = ((Route)(data.Route)).Constraints;
            var helpConstraint = (from c in constraints.Values
                                  where c.GetType().Equals(typeof(HelpConstraint))
                                  select c).FirstOrDefault();
            if (helpConstraint != null)
            {
                return ((HelpConstraint) helpConstraint).SampleType;
            }
        }

        return null;
    }

    public static string getmethodType(this RouteData data)
    {
        if (data != null && data.Route != null)
        {
            var constraints = ((Route) (data.Route)).Constraints;
            var httpMethodConstraint = (from c in constraints.Values
                                        where c.GetType().Equals(typeof (HttpMethodConstraint))
                                        select c).FirstOrDefault();
            if (httpMethodConstraint != null)
            {
                return ((HttpMethodConstraint) httpMethodConstraint).AllowedMethods.Single();
            }
        }

        return null;
    }

    public static bool IsErrorController(this Route data)
    {
        if (data != null)
        {
            var defaults = ((Route)(data)).Defaults;
            var controllerName = (from c in defaults.Values
                                        where c.ToString().Contains(\"Error\")
                                        select c).FirstOrDefault();
            if (controllerName != null)
            {
                return true;
            }
        }

        return false;
    }

    public static RouteData GetRouteDataByUrl(this string url)
    {
        string httpMethod = \"PUT\";
        var fakeContext = new FakeHttpContext(MakeAppRelative(url),httpMethod);
        return RouteTable.Routes.GetRouteData(fakeContext);
    }

    private static string MakeAppRelative(string url)
    {
        if (!url.StartsWith(\"~\"))
        {
            if (!url.StartsWith(\"/\"))
                url = \"~/\" + url;
            else
                url = \"~\" + url;
        }
        return url;
    }
}

 public class HelpConstraint : IRouteConstraint
{
    public bool Help { get; set; }
    public Type SampleType { get; set; }

    public bool Match(HttpContextBase httpContext,Route route,string parameterName,RouteValueDictionary values,RouteDirection routeDirection)
    {
        if(Help)
        {
            return true;
        }

        return false;
    }
}

References
http://stephenwalther.com/blog/archive/2008/08/03/asp-net-mvc-tip-29-build-a-controller-to-debug-your-custom-routes.aspx
http://aspnet.codeplex.com/releases/view/24644
代码不是错误。如果有任何改进,请发表。需要您自担风险使用它。     

解决方法

不确定所要查找的内容,但可以查看GhostDoc: http://submain.com/products/ghostdoc.aspx 我用它来生成MVC中的XML文档。     ,到目前为止,您很可能已经解决了您的问题。无论如何,我认为您需要IApiExplorer。看看这个博客。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?