1

我有一个使用 WebApi + signalR + 自托管的应用程序。而且我添加了 RazorEngine 以启用具有剃刀语法的 cshtml 视图。

这可行(参见下面的简化代码),但这会导致所有 WebApi 调用尝试通过视图+剃刀生成 HTML。我想要一些 WebAPi,它只是将普通的 XML 或 JSON 发送到来自客户端的请求。例如,一个 api 控制器使用普通 XML/JSON,一个 api 控制器使用 vews/razor/cshtml 生成响应

有什么想法我会怎么做?

    class Program  {
        static void Main(string[] args)  {  
            using (WebApp.Start<Startup>(url: "http://localhost:8080/")) {
                Console.WriteLine("Started");
                Console.ReadKey();
            }
        }
    }


    public class Startup {
        public void Configuration(IAppBuilder app)  {
            HttpConfiguration config = new HttpConfiguration();
            config.Routes.MapHttpRoute(
                  name: "DefaultApi",
                  routeTemplate: "api/{controller}/{id}",
                  defaults: new { id = RouteParameter.Optional }
              );
            app.UseWebApi(config);
            app.UseCors(CorsOptions.AllowAll);
            app.MapSignalR();

            // RazorEngine - so WebApi can use views+razor
            GlobalConfiguration.Configuration.Formatters.Add(new HtmlMediaTypeViewFormatter());
            GlobalViews.DefaultViewParser = new RazorViewParser();
            GlobalViews.DefaultViewLocator = new RazorViewLocator();
            config.Formatters.Add(new HtmlMediaTypeViewFormatter());
        }
    }



    public class HomeController : ApiController {

        //http://localhost:8080/api/home
        public Value GetValues()  {
            return new Value() { Numbers = new int[] { 1, 2, 3 } };
        }

        //want to return just XML and not go via the view+razor+cshtml
        //Works ok for normal self-hosted webapi, but cant get to work for views+razor
        //http:localhost:8080/api/home/1
        public String Get2(int id)  {
            return "Get2() returns a string";
        }

    }


    [View("Home")]     //need this line to get the webApi views+razor to work
    public class Value  {
        public int[] Numbers { get; set; }
    }

主页.cshtml...

<html>
<head>
    <title>Hello World!</title>
</head>
<body>
    <h1>Hello World! ..</h1>
    <ul>
        @foreach (var value in Model.Numbers)
        {
            <li>@value</li>
        }
    </ul>
</body>
</html> 
4

1 回答 1

2

有几种方法。

A)您可以让客户端发送正确的接受标头,以便 Web API 协商正确的格式化程序。

b) 您可以基于每个控制器自定义配置。这将允许您仅为要返回 HTML 的控制器定义 HTML 格式化程序。这是有关如何按控制器配置进行操作的链接:http: //blogs.msdn.com/b/jmstall/archive/2012/05/11/per-controller-configuration-in-webapi.aspx

c) 不要为 HTML 控制器使用返回管道连接。返回一个 HttpResposeMessage 并明确设置 Content 属性。

 public class HomeController : ApiController {

    //http://localhost:8080/api/home
    public HttpResponseMessage GetValues()  {
        var value = Value() { Numbers = new int[] { 1, 2, 3 } };

        return new HttpResponseMessage() {
                 Content = new ObjectContent<Value>(value, new HtmlMediaTypeViewFormatter())
             };
    }

    //want to return just XML and not go via the view+razor+cshtml
    //Works ok for normal self-hosted webapi, but cant get to work for views+razor
    //http:localhost:8080/api/home/1
    public String Get2(int id)  {
        return "Get2() returns a string";
    }

}
于 2014-02-04T12:28:43.810 回答