我有一个基于WCF REST服务模板40(CS)的WCF REST 4.0项目。我想公开没有尾随斜杠的简单服务端点URL。例如:
GET
的单个汽车
的单个卡车
我把上面的URL看作是资源请求(而不是目录),这就是为什么我不认为尾随斜杠在这里是合适的。
不幸的是,我似乎无法获得我想要的行为,因为我总是被重定向到带有尾随斜杠的/car/和/trucks/。
下面是我如何定义"cars“路由和服务方法-请注意,我在任何路由或URI模板定义中都没有包括任何斜杠:
// Global.asax.cs
RouteTable.Routes.Add(new ServiceRoute("cars", new WebServiceHostFactory(), typeof(CarService)));
// CarService.cs
[WebGet(UriTemplate = "")]
public List<Car> GetCollection()
{
return DataContext.GetAllCars();
}
请注意,MVC不是以这种方式工作的。使用MapRoute方法,我可以将请求直接路由到http://www.domain.com/about,而无需重定向到/about/。如何在WCF REST 4.0中获得相同的行为?
发布于 2010-10-20 09:13:59
您遇到的主要问题是,当您的WebGet属性中的UriTemplate为空字符串时,WCF REST的当前版本会导致307重定向(到"/")。据我所知,在当前版本中无法绕过这一点。
但是,如果您想要一个1)允许您区分服务和2)具有(相对)较短URI的解决方案,那么您的问题有两种“中间”解决方案。
First Solution你可以把它放在你的global.asax文件中(根据this example)。您可以为每个服务创建一个服务路由:
RouteTable.Routes.Add(new ServiceRoute("cars", new WebServiceHostFactory(), typeof(CarService)));
RouteTable.Routes.Add(new ServiceRoute("trucks", new WebServiceHostFactory(), typeof(TruckService)));
此时,您可以在每个服务中填充UriTemplate:
[WebGet(UriTemplate = "all")]
CarPool GetAllCars();
[WebGet(UriTemplate = "{carName}")]
Car GetCar(string carName);
这将允许您执行以下URI:
www.domain.com/cars/all
www.domain.com/cars/123 or www.domain.com/cars/honda
卡车也是如此:
www.domain.com/trucks/all
www.domain.com/trucks/123 or www.domain.com/trucks/ford
第二个解决方案使用来自REST Starter Kit的服务主机(即WebServiceHost2Factory)。
RouteTable.Routes.Add(new ServiceRoute("cars", new WebServiceHost2Factory(), typeof(CarService)));
当使用上面尝试使用的URI时,这不会导致307重定向,因此,它会提供您所需要的内容。虽然我意识到使用该服务主机工厂而不是WCF4附带的服务主机工厂感觉有点奇怪。
发布于 2010-10-20 04:14:27
如果你需要一个UriTemplate,试试下面这样:
[ServiceContract()]
public interface ICarService
{
[OperationContract]
[WebGet(UriTemplate = "/Car")]
CarPool GetAllCars();
[OperationContract]
[WebGet(UriTemplate = "/Car/{carName}")]
Car GetCar(string carName);
}
发布于 2012-06-01 09:07:51
尝试将此代码放入Global.asax.cs
protected void Application_BeginRequest(object sender, EventArgs e)
{
string rawUrl = HttpContext.Current.Request.RawUrl.ToLower();
if (rawUrl.EndsWith("/cars"))
{
HttpContext.Current.RewritePath(rawUrl + "/"); // append trailing slash
}
}
https://stackoverflow.com/questions/3970951
复制相似问题