Asp.net mvc 如何编写一个MVC3/4应用程序,既可以作为web API,又可以作为该API上的UI?

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,我可以分别使用Razor视图引擎和MVC3控制器操作来提供和使用它们。然后,可以通过自定义视图引擎提供其他数据格式。很久以前,除了非常基本的web服务之外,我从未真正在这个领域工作过。我的选择是什么?我看到链接到MVC4的这个Web 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