gpt4 book ai didi

wcf - WCF Rest 4.0 中不带尾部斜杠的简单 URL 路由

转载 作者:行者123 更新时间:2023-12-02 09:21:25 24 4
gpt4 key购买 nike

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

  1. CarService.cs
  2. TruckService.cs

我将上述 URL 视为资源请求(而不是目录),这就是为什么我认为尾部斜杠在这里不合适。

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

以下是我定义“汽车”路线和服务方法的方法 - 请注意,我没有在任何路线或 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 中获得相同的行为?

最佳答案

您遇到的主要问题是,当 WebGet 中的 UriTemplate 为空字符串时,当前版本的 WCF REST 会导致 307 重定向(到“/”)属性。据我所知,当前版本中无法解决此问题。

但是,考虑到您需要一个能够 1) 允许区分服务,2) 具有(相对)短 URI 的解决方案,您的问题有一些“中间立场”解决方案。

第一个解决方案您可以将其放入 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 重定向,因此可以准确满足您的需要。尽管我意识到使用该服务主机工厂而不是 WCF 4 附带的服务主机工厂感觉有点奇怪。

关于wcf - WCF Rest 4.0 中不带尾部斜杠的简单 URL 路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3970951/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com