我有一个使用WebApi Signalr 自托管的应用程序。而且我添加了Razorengine,以启用使用Razor语法使用CSHTML视图。
这起作用(请参见下面的简化代码),但这会导致所有WebAPI调用试图通过视图 剃须刀生成HTML。我想拥有一些仅将正常XML或JSON发送给客户端请求的WebAPI。例如。也许,一个使用普通XML/JSON和一个API控制器的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; }
}
home.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>
有几种方法。
a)您只需使客户端发送正确的接受标头,以便Web API谈判正确的格式化。
b)您可以按照控制器自定义配置。这将允许您仅针对要返回HTML的控制器定义HTML格式。这是有关如何执行每个控制器配置的链接:http://blogs.msdn.com/b/jmstall/archive/2012/05/05/11/per-controller-controller-configuration-in-webapi.aspx
c)不要将返回管线连接用于HTML控制器。返回httpresposemessage并明确设置内容属性。
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";
}
}