Simple URL routes in WCF Rest 4.0 without trailing slash

后端 未结 7 1438
太阳男子
太阳男子 2021-02-01 20:27

I have a WCF REST 4.0 project based on the the WCF REST Service Template 40(CS). I\'d like to expose simple service endpoint URLs without trailing slashes. For example:

7条回答
  •  鱼传尺愫
    2021-02-01 21:03

    The primary issue that you're running into is that the current version of WCF REST causes a 307 redirect (to the "/") when you have an empty string for the UriTemplate in your WebGet attribute. As far as I know, there is no getting around this in the current version.

    However, there are a couple of "middle ground" solution to your problem given that you want a solution that 1) allows you to differentiate services, and 2) have (relatively) short URIs.

    First Solution You can put this in your global.asax file (per this example). You can do a service route for each service:

    RouteTable.Routes.Add(new ServiceRoute("cars", new WebServiceHostFactory(), typeof(CarService)));
    RouteTable.Routes.Add(new ServiceRoute("trucks", new WebServiceHostFactory(), typeof(TruckService)));
    

    At this point you can populate your UriTemplate in each service:

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

    This will allow you URIs of:

    www.domain.com/cars/all
    www.domain.com/cars/123 or www.domain.com/cars/honda
    

    similarly for trucks:

    www.domain.com/trucks/all
    www.domain.com/trucks/123 or www.domain.com/trucks/ford
    

    Second Solution Use the service host from the REST Starter Kit (i.e., the WebServiceHost2Factory).

    RouteTable.Routes.Add(new ServiceRoute("cars", new WebServiceHost2Factory(), typeof(CarService)));
    

    This does not result in a 307 redirect when using the URIs that you're attempting to use above and thus, gives you exactly what you need. Though I realize that feels a little weird using that service host factory rather than the one that ships with WCF 4.

提交回复
热议问题