WCF中的路由 - 它可以像MVC吗?

时间:2014-08-10 20:21:23

标签: wcf

免责声明:是的我知道WCF不是Web API或MVC。但是我试图找出一个hack来做一些MVC对路由做的事情,这样当我用不同的查询字符串连接不同的请求时,我可以在我的.svc合同中保留相同的方法名称。 PARAMS。

所以我有这个愚蠢的WCF服务,我希望在这里有一个重载的Get方法。但是我不能,当我试图打电话给这项服务时,WCF就会这么做。

我有2个名为“Get”的方法,我试图基本上重载但是通过查询字符串进行区分。注意下面的两个在uri中有不同的查询字符串集,所以我的意图是不必拥有所有这些不同的Get,GetbySomething,GetBySomething2。在所有mymethods上坚持使用名称Get()并且只是重载它们/区分它们以便进入的请求可以连接到像MVC那样的查询字符串区分类型是很好的:

   [WebGet(UriTemplate = "?securityToken={securityToken}&brokerId={brokerId}&orderStatus={orderStatus}&pageNumber={pageNumber}&pageSize={pageSize}&sortBy={sortBy}&purchaseOrderNumber={purchaseOrderNumber}")]
        public OrderResponse Get(string securityToken, string brokerId, string orderStatus, string pageNumber, string pageSize, string sortBy, string purchaseOrderNumber)

   [WebGet(UriTemplate = "?securityToken={securityToken}&brokerId={brokerId}&purchaseOrderNumber={purchaseOrderNumber}&startDate={startDate}&endDate={endDate}&pageNumber={pageNumber}&pageSize={pageSize}&sortBy={sortBy}")]
        public OrderResponse Get(string securityToken, string brokerId, int purchaseOrderNumber, string startDate, string endDate, string pageNumber, string pageSize, string sortBy)

来自WCF的响应错误:“不能在同一个合同中使用相同名称的两个操作,方法GetService和GetService类型违反此规则。您可以通过更改方法名称来更改其中一个操作的名称或者使用OperationContractAttribute的Name属性。“

好的没什么好的。那么我可以以某种方式在我的global.asax中使用路由表来基本上做MVC可以做的事情吗?

RouteTable.Routes.Add(new ServiceRoute("Inventory", new WebServiceHostFactory(), typeof(InventoryService)));

MVC允许我进行映射,但将查询字符串作为匹配的一部分:

只是一个例子,我可以考虑querystrings?someParam = {someValue}

 routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}?someParam={someValue}",
                defaults: new { id = RouteParameter.Optional }
            );

是的我也知道在MVC中你可以重载你的方法来通过控制器中的参数来区分它们,你可以在这里看到我的Get()的WCF契约方法有不同的参数集,所以有人认为WCF会让你用params区分相同的方法名称,但它没有。

您可以重载函数以接受不同的参数 因为在WCF中,指定查询字符串匹配部分的方式是via属性:

[WebGet(UriTemplate = "?securityToken={securityToken}&brokerId={brokerId}&purchaseOrderNumber={purchaseOrderNumber}&startDate={startDate}&endDate={endDate}&pageNumber={pageNumber}&pageSize={pageSize}&sortBy={sortBy}]

那么有没有办法在我的global.ascx中使用我的R outeTable.Routes.Add(new ServiceRoute("V1/Inventory", new WebServiceHostFactory(), typeof(InventoryService)));以某种方式让我使得方法名称唯一并通过查询字符串区分它们来重载它们?

因为现在要解决这个问题,我必须将我的一个Get方法名称改为其他IMO愚蠢和不洁的东西。我必须做像GetByDateRange这样的事情。所以我必须做一些事情:

   [WebGet(UriTemplate = "?securityToken={securityToken}&brokerId={brokerId}&orderStatus={orderStatus}&pageNumber={pageNumber}&pageSize={pageSize}&sortBy={sortBy}&purchaseOrderNumber={purchaseOrderNumber}")]
        public OrderResponse Get(string securityToken, string brokerId, string orderStatus, string pageNumber, string pageSize, string sortBy, string purchaseOrderNumber)

   [WebGet(UriTemplate = "?securityToken={securityToken}&brokerId={brokerId}&purchaseOrderNumber={purchaseOrderNumber}&startDate={startDate}&endDate={endDate}&pageNumber={pageNumber}&pageSize={pageSize}&sortBy={sortBy}")]
        public OrderResponse GetByDateRange(string securityToken, string brokerId, int purchaseOrderNumber, string startDate, string endDate, string pageNumber, string pageSize, string sortBy)

这让我回到我的Web服务处理背后的RPC样式方法名称,我讨厌这个。我们也正在使用WCF,所以我想通过一堆重载的Put()方法,Get()等来保持干净。

0 个答案:

没有答案