C# RESTful(WebAPI)服务中的非CRUD操作

C# RESTful(WebAPI)服务中的非CRUD操作,c#,asp.net,wcf,asp.net-web-api,C#,Asp.net,Wcf,Asp.net Web Api,通过将现有的WCF服务转换为WebAPI,我正在学习WebAPI(以及一般的REST)。在这个过程中,我对处理非积垢操作的最佳方法感到困惑。这是我的服务合同: [ServiceContract] public interface IProxyHelper { [OperationContract] List<ProxyInfo> GetUsersCurrentUserCanActAsProxyFor(int positionId, int appId); [

通过将现有的WCF服务转换为WebAPI,我正在学习WebAPI(以及一般的REST)。在这个过程中,我对处理非积垢操作的最佳方法感到困惑。这是我的服务合同:

[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);
}
[服务合同]
公共接口IProxyHelper
{
[经营合同]
列出GetUsersCurrentUserCanActAsProxyFor(int-positionId,int-appId);
[经营合同]
无效删除代理(int-id);
[经营合同]
列出GetProxyData(int-appId);
[经营合同]
bool-CanPositionProxy(int-positionId,int-appId);
[经营合同]
无效添加代理(
字符串userRacf,
字符串proxyAsRacf,
int userPositionId,
int proxyPositionId,
由ACF请求的字符串,
int-appId);
[经营合同]
int GetPositionIdByRacf(字符串racf);
[经营合同]
字符串GetRacfByPositionId(int-positionId);
}
有些方法,如DeleteProxy和AddProxy I,可以很容易地转移到基于CRUD的方法

问题围绕着:

GetProxyData-代理系统由多个应用程序使用,虽然我可以使用api/proxy/1,但我觉得这是“欺骗”,因为这应该是为了获取ProxyId 1,而不是应用程序1的代理

GetUsersCurrentUserCanActAsProxyFor——这一个在多个层面上对我来说都很混乱。我应该如何处理多个参数?而且它也不完全属于CRUD方法


这是否意味着我应该放弃WebAPI转换?如果没有,我应该如何处理这些非标准方法?

我认为您将RESTful服务与CRUD混淆了。这两者并不相同,尽管将CRUD转换为REST非常简单(资源和动词都有一个清晰的映射)

RESTful体系结构的最大区别在于它是面向资源的。第二个是利用传输(HTTPs)协议对这些资源进行操作——对于REST,就是GET、POST、PUT和DELETE

转到您的示例,您最大的问题似乎是决定使用URI方案来支持此服务。我可以建议,对于分层信息,这应该是直接的。例如,应用程序代理:

/application//代理

并且当前用户可以作为以下各项的代理:

/user//proxy users
或根据您的风格
/user//proxy/users

或者类似的东西。你要考虑关系和潜在资源。许多URI可以指向同一资源

请注意,正如@dtb在其评论中提到的,URI和/或(不太可取)cookie在每个请求中都包含所有需要的信息。所以
CurrentUser
有点像黑客


在转换过程中,您可能还会发现以下有趣的信息:

GetUsersCurrentUserCanActAsProxyFor
不是RESTful,因为请求需要隐式了解“当前”用户。将其更改为
getUserSuserCanatsProxyFor(字符串用户,int-positionId,int-appId)
,如果请求者没有权限查看除他自己以外的用户的信息,则返回状态401。
GetUsersUserCanActAsProxyFor
GetProxyData
似乎都符合GET(安全、幂等)的要求,因此如何设计URI只是一个品味问题。感谢您的澄清,dtb。在我进一步尝试将我的WCF转换为WebAPI之前,我想我会对REST范例做更多的阅读。谢谢,yamen,这很有帮助。因此,我不应该有一个“代理服务”端点,而应该有三个:ApplicationProxies、UserProxies和ProxyCrud?没有一个服务是好的,只需要适当地路由到它。