【发布时间】:2012-05-02 20:43:07
【问题描述】:
我正在通过将现有 WCF 服务转换为 WebAPI 来学习 WebAPI(以及一般的 REST)。在此过程中,我对处理非 CRUD 操作的最佳方式感到困惑。这是我的服务合同:
[ServiceContract]
public interface IProxyHelper
{
[OperationContract]
List<ProxyInfo> GetUsersCurrentUserCanActAsProxyFor(int positionId, int appId);
[OperationContract]
void DeleteProxy(int id);
[OperationContract]
List<ProxyInfo> GetProxyData(int appId);
[OperationContract]
bool CanPositionProxy(int positionId, int appId);
[OperationContract]
void AddProxy(
string userRacf,
string proxyAsRacf,
int userPositionId,
int proxyPositionId,
string requestedByRacf,
int appId);
[OperationContract]
int GetPositionIdByRacf(string racf);
[OperationContract]
string GetRacfByPositionId(int positionId);
}
一些方法,例如 DeleteProxy 和 AddProxy,我可以轻松地转向基于 CRUD 的方法。
问题出现在:
GetProxyData - 代理系统被多个应用程序使用,虽然我可以做 api/Proxy/1,但我觉得那是“作弊”,因为这应该是为了获取 ProxyId 1,而不是应用程序 1 的代理。
GetUsersCurrentUserCanActAsProxyFor - 这对我来说在多个层面上都令人困惑。我应该如何处理多个参数?而且它也不完全属于 CRUD 方法。
这是否意味着我应该放弃 WebAPI 转换?如果不是,我应该如何处理这些非标准方法?
【问题讨论】:
-
GetUsersCurrentUserCanActAsProxyFor不是 RESTful,因为请求需要“当前”用户的隐式知识。如果请求者无权查看自己以外的用户的信息,请将其更改为GetUsersUserCanActAsProxyFor(string user, int positionId, int appId)并返回状态 401。GetUsersUserCanActAsProxyFor和GetProxyData似乎都符合 GET(安全、幂等)的要求,因此如何设计 URI 只是个人喜好问题。 -
感谢您的澄清,dtb。在我进一步尝试盲目地将我的 WCF 转换为 WebAPI 之前,我想我会更多地阅读 REST 范例。
标签: c# asp.net wcf asp.net-web-api