如何解决如何为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 举报,一经查实,本站将立刻删除。