首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >WCF Rest 4.0中没有尾部斜杠的简单URL路由

WCF Rest 4.0中没有尾部斜杠的简单URL路由
EN

Stack Overflow用户
提问于 2010-10-20 01:22:05
回答 7查看 13.5K关注 0票数 19

我有一个基于WCF REST服务模板40(CS)的WCF REST 4.0项目。我想公开没有尾随斜杠的简单服务端点URL。例如:

GET

  1. CarService.cs

的单个汽车

  1. TruckService.cs

的单个卡车

我把上面的URL看作是资源请求(而不是目录),这就是为什么我不认为尾随斜杠在这里是合适的。

不幸的是,我似乎无法获得我想要的行为,因为我总是被重定向到带有尾随斜杠的/car/和/trucks/。

下面是我如何定义"cars“路由和服务方法-请注意,我在任何路由或URI模板定义中都没有包括任何斜杠:

代码语言:javascript
复制
// 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中获得相同的行为?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-10-20 09:13:59

您遇到的主要问题是,当您的WebGet属性中的UriTemplate为空字符串时,WCF REST的当前版本会导致307重定向(到"/")。据我所知,在当前版本中无法绕过这一点。

但是,如果您想要一个1)允许您区分服务和2)具有(相对)较短URI的解决方案,那么您的问题有两种“中间”解决方案。

First Solution你可以把它放在你的global.asax文件中(根据this example)。您可以为每个服务创建一个服务路由:

代码语言:javascript
复制
RouteTable.Routes.Add(new ServiceRoute("cars", new WebServiceHostFactory(), typeof(CarService)));
RouteTable.Routes.Add(new ServiceRoute("trucks", new WebServiceHostFactory(), typeof(TruckService)));

此时,您可以在每个服务中填充UriTemplate:

代码语言:javascript
复制
[WebGet(UriTemplate = "all")]
CarPool GetAllCars();

[WebGet(UriTemplate = "{carName}")]
Car GetCar(string carName);

这将允许您执行以下URI:

代码语言:javascript
复制
www.domain.com/cars/all
www.domain.com/cars/123 or www.domain.com/cars/honda

卡车也是如此:

代码语言:javascript
复制
www.domain.com/trucks/all
www.domain.com/trucks/123 or www.domain.com/trucks/ford

第二个解决方案使用来自REST Starter Kit的服务主机(即WebServiceHost2Factory)。

代码语言:javascript
复制
RouteTable.Routes.Add(new ServiceRoute("cars", new WebServiceHost2Factory(), typeof(CarService)));

当使用上面尝试使用的URI时,这不会导致307重定向,因此,它会提供您所需要的内容。虽然我意识到使用该服务主机工厂而不是WCF4附带的服务主机工厂感觉有点奇怪。

票数 9
EN

Stack Overflow用户

发布于 2010-10-20 04:14:27

如果你需要一个UriTemplate,试试下面这样:

代码语言:javascript
复制
 [ServiceContract()]
 public interface ICarService
 {

     [OperationContract]
     [WebGet(UriTemplate = "/Car")]
     CarPool GetAllCars();

     [OperationContract]
     [WebGet(UriTemplate = "/Car/{carName}")]
     Car GetCar(string carName);

 }
票数 3
EN

Stack Overflow用户

发布于 2012-06-01 09:07:51

尝试将此代码放入Global.asax.cs

代码语言:javascript
复制
    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
        }
    }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3970951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档