Asp.net mvc 如何编写一个MVC3/4应用程序,既可以作为web API,又可以作为该API上的UI?
我的标题很好地概括了这一点。我的第一个想法是提供一些数据格式,其中一种是HTML,我可以分别使用Razor视图引擎和MVC3控制器操作来提供和使用它们。然后,可以通过自定义视图引擎提供其他数据格式。很久以前,除了非常基本的web服务之外,我从未真正在这个领域工作过。我的选择是什么?我看到链接到MVC4的这个Web API是什么Asp.net mvc 如何编写一个MVC3/4应用程序,既可以作为web API,又可以作为该API上的UI?,asp.net-mvc,asp.net-mvc-3,rest,asp.net-web-api,Asp.net Mvc,Asp.net Mvc 3,Rest,Asp.net Web Api,我的标题很好地概括了这一点。我的第一个想法是提供一些数据格式,其中一种是HTML,我可以分别使用Razor视图引擎和MVC3控制器操作来提供和使用它们。然后,可以通过自定义视图引擎提供其他数据格式。很久以前,除了非常基本的web服务之外,我从未真正在这个领域工作过。我的选择是什么?我看到链接到MVC4的这个Web API是什么 注意:我的主要HTML应用程序不需要直接脱离API运行。我想首先编写API,由一个框架HTML客户机的需求驱动,它有一个非常基本的UI,一旦API被固定下来,然后编写一个
注意:我的主要HTML应用程序不需要直接脱离API运行。我想首先编写API,由一个框架HTML客户机的需求驱动,它有一个非常基本的UI,一旦API被固定下来,然后编写一个功能齐全的UI客户端,使用与API相同的服务,但绕过实际的数据解析和表示API组件。第一次谈到Web API时,我就有了同样的想法。简而言之,WebAPI是MS.NETWeb堆栈的一个新产品,它构建在WCF、OData和MVC之上,提供了创建RESTfulWebAPI的统一方法。这方面有很多资源,所以去谷歌看看吧 现在谈谈这个问题 问题是,您当然可以让Web API返回HTML、JSON、XML等,但这里缺少的是Razor/ASPX/insertviewenginehere提供的视图/模板。这不是“API”真正的工作 当然,您可以编写客户端代码来调用Web API,并使用大量可用插件执行模板/UI客户端 我很确定Web API不能像ASP.NET MVC Web应用程序那样返回模板化HTML 因此,如果您想“重用”应用程序的某些部分(存储库、域等),最好将调用封装在门面/服务层中,并将Web API和ASP.NET MVC Web应用程序调用分离到门面/服务层中,以减少代码 最后,您应该得到一个ASP.NET MVC web应用程序,它调用域并构建模板化HTML,以及一个ASP.NET web API应用程序,它调用域并返回各种资源(JSON、XML等)
如果您有一个结构良好的应用程序,那么这种形式的抽象应该不是问题。您看到了吗?可能想在观看之前下载,这样就不会跳过 如果您确实需要使用WebAPI返回HTML,例如允许用户 单击周围并使用相同的URL浏览API,然后可以使用路由\ html消息处理程序
public class HtmlMessageHandler : DelegatingHandler
{
private List<string> contentTypes = new List<string> { "text/html", "application/html", "application/xhtml+xml" };
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
if (request.Method == HttpMethod.Get && request.Headers.Accept.Any(h => contentTypes.Contains(h.ToString())))
{
var response = new HttpResponseMessage(HttpStatusCode.Redirect);
var htmlUri = new Uri(String.Format("{0}/html", request.RequestUri.AbsoluteUri));
response.Headers.Location = htmlUri;
return Task.Factory.StartNew<HttpResponseMessage>(() => response);
}
else
{
return base.SendAsync(request, cancellationToken);
}
}
}
公共类HtmlMessageHandler:DelegatingHandler
{
私有列表contentTypes=新列表{“text/html”、“application/html”、“application/xhtml+xml”};
受保护的覆盖任务SendAsync(HttpRequestMessage请求,CancellationToken CancellationToken)
{
if(request.Method==HttpMethod.Get&&request.Headers.Accept.Any(h=>contentTypes.Contains(h.ToString()))
{
var响应=新的HttpResponseMessage(HttpStatusCode.Redirect);
var htmlUri=newURI(String.Format(“{0}/html”,request.RequestUri.AbsoluteUri));
response.Headers.Location=htmlUri;
返回Task.Factory.StartNew(()=>response);
}
其他的
{
返回base.sendaync(请求、取消令牌);
}
}
}
有关完整示例,请查看:-
我以前就有过这个想法。我通过MVC3在不同的控制器上公开了一个API作为JSONResult方法。我使用控制器操作过滤器实现了API的自定义安全性。然后构建了一个使用JSON服务的非常重AJAX的HTML前端。它工作得很好,性能也很好,因为web应用程序的所有数据都是通过AJAX传输的。创建Html是Mvc控制器的工作,而不是web Api的工作,因此,如果您需要能够返回使用某些视图引擎生成的jSon和Html的内容,最好的选择是标准Mvc控制器操作方法。内容协商,即返回的格式,可以通过Action Fiter实现。我有一个操作过滤器,使控制器能够从客户端接收返回格式的“提示”。客户端可以要求返回具有特定名称或jSon的视图。提示以查询字符串或隐藏字段的形式发送(如果请求来自表单提交)。代码如下:
public class AcceptViewHintAttribute : ActionFilterAttribute
{
private JsonRequestBehavior jsBehavior;
public AcceptViewHintAttribute(JsonRequestBehavior jsBehavior = JsonRequestBehavior.DenyGet)
{
this.jsBehavior = jsBehavior;
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
string hint = filterContext.RequestContext.HttpContext.Request.Params["ViewHint"];
if (hint == null) hint = filterContext.RequestContext.RouteData.Values["ViewHint"] as string;
if (!string.IsNullOrWhiteSpace(hint) && hint.Length<=100 && new Regex(@"^\w+$").IsMatch(hint) )
{
ViewResultBase res = filterContext.Result as ViewResultBase;
if (res != null)
{
if (hint == "json")
{
JsonResult jr = new JsonResult();
jr.Data = res.ViewData.Model;
jr.JsonRequestBehavior = jsBehavior;
filterContext.Result = jr;
}
else
{
res.ViewName = hint;
}
}
}
base.OnActionExecuted(filterContext);
}
}
公共类AcceptViewHintAttribute:ActionFilterAttribute
{
私有JsonRequestBehavior jsBehavior;
公共AcceptViewHintaAttribute(JsonRequestBehavior=JsonRequestBehavior.DenyGet)
{
this.jsBehavior=jsBehavior;
}
公共覆盖无效OnActionExecuted(ActionExecutedContext筛选器上下文)
{
字符串提示=filterContext.RequestContext.HttpContext.Request.Params[“ViewHint”];
如果(hint==null)hint=filterContext.RequestContext.RoutedData.Values[“ViewHint”]作为字符串;
如果(!string.IsNullOrWhiteSpace(hint)&&hint.Length我建议开发应用程序时使用单个控制器返回初始应用程序资产(html、javascript等)到浏览器。在WebAPI端点服务中创建API/逻辑,并通过JavaScript访问这些服务。基本上是创建一个单页应用程序。使用MVC 4,我们的控制器可以根据设备(电话、桌面、平板电脑)返回不同的视图,但使用相同的JavaScript,您的所有客户端都将能够访问该服务
好的库包括、、或这里有一本关于MVC和Web API的必读读物-。现在已经过了一段时间的测试版,MS刚刚发布了MVC4/VS2012/etc的发布候选版本。在导航/帮助页面上(其他一些海报提到),他们添加了一个新的IApiExplorer