ASP.NET Web API可以在与MVC相同的URL上工作吗?

时间:2012-03-04 19:22:42

标签: .net asp.net-mvc rest asp.net-mvc-4 asp.net-web-api

我可以为返回HTML的ASP.NET MVC请求和返回JSON的ASP.NET Web API提供相同的URL吗?

我在示例中看到这样的路由:"api/{id}"但是我可以摆脱这个api/部分在MVC(而不是Web API)中使用此地址吗? / p>

一方面,这应该是可能的,因为我们有内容协商。但是这样我需要两条具有相同地址的路由,所以这没有意义,对吧?

换句话说:我可以ControllerApiController使用相同的网址吗?或者我也应该将ApiController用于HTML吗?

7 个答案:

答案 0 :(得分:5)

如前面的答案中所述,你不能做这样的事情,我真的不明白你为什么要做那样的事情。

但是我不同意你应该在一个项目中坚持一件事,如果你想要一个干净的API然后我会去webapi并使用MVC来托管我的页面,那时我会有API在一个单独的文件夹中加上一条单独的路线。

答案 1 :(得分:3)

我可能会在这里扮演恶魔倡导者,但我可以看出为什么有人会想做这样的事情。

在同一个URL上拥有API的HTML表示通常很好。这种方法允许用户在浏览器中点击并浏览API。

我通过使用302重定向到MVC路由的自定义消息处理程序在WebAPI中解决了这个问题。

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())))
        {
            HttpResponseMessage 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);
        }
    }
}

可能有点破解,但它确实起作用,我个人更喜欢它,而不是自定义HTML MediaTypeFormatter(我也尝试过);)

答案 2 :(得分:2)

WebAPI允许您通过实施System.Web.Http.Routing.IHttpRouteConstraint来定义自定义路由约束。

在常规ASP.NET MVC中,您可以通过实现System.Web.Routing.IRouteConstraint来完成相同的工作。

这样,您可以创建仅对某个HTTP Accept标头有效的路由,例如“application / json”或“text / html”。

答案 3 :(得分:1)

不,您不能拥有指向两个不同类的单个URL路由。如果多个路由与传入请求匹配,则将使用要匹配的第一个路径。

我不确定为什么你需要在一个项目中混合两者,至少没有任何实际原因。 ApiController可以返回HTML,MVC Controller可以返回JSON,所以只需选择一个并使用它。

答案 4 :(得分:1)

以前的答案已经解释了这种情况。要添加的一件事是,ASP.NET MVC或Web API,您的所有路由都会收集在同一列表中。

例如,在默认项目模板上,如果在Web API之前注册ASP.NET MVC路由,您将看到ASP.NET MVC路由选择了/api路径下的请求。 / p>

答案 5 :(得分:1)

理论上,您可以使用web api并构建一个内容提供程序,当客户端请求application \ json

时,客户端请求text \ html和json时将返回html(可能来自razor)

答案 6 :(得分:0)

由于Web API使用与MVC相同的路由系统,如果您有某种方法来区分路由,那么您可以为两者使用相同的基本URL。您需要某种路由约束来将api调用映射到api。例如,这可以是查询字符串参数。

如果你的网址完全相同,甚至到查询字符串,那么没有。你运气不好。