WCF Restful服务是否允许公开与WebGet和WebInvoke相同的方法

本文关键字:WebInvoke 方法 WebGet 服务 Restful 是否 许公开 WCF | 更新日期: 2023-09-27 17:58:58

WCF Restful服务是否允许与WebGet和WebInvoke一样的方法重载公开?两种方法都应该可以从同一个URL访问。

例如

 [ServiceContract]
public interface IWeChatBOService
{
    [WebGet(UriTemplate = "WeChatService/{username}")]
    [OperationContract]
    string ProcessRequest(string MsgBody);
    [WebInvoke(Method = "POST", UriTemplate = "WeChatService/{username}")]
    [OperationContract]
    string ProcessRequest(string MsgBody);

有可能使用WCF Restful服务吗?

WCF Restful服务是否允许公开与WebGet和WebInvoke相同的方法

是的,这是可能的,龙舌兰的答案非常接近预期:

[ServiceContract]
public interface IWeChatBOService
{
    [WebGet(UriTemplate = "WeChatService/{msgBody}")]
    [OperationContract]
    string ProcessRequest(string msgBody);
    [WebInvoke(Method = "POST", UriTemplate = "WeChatService")]
    [OperationContract]
    string ProcessRequest2(string msgBody);
}

但我不建议设计这样的api。最好在enpoint描述中描述基本uri,UriTemplate应该反映资源标识符:

[ServiceContract]
public interface IWeChatBOService
{
    [WebGet(UriTemplate = "messages/{messageId}")]
    [OperationContract]
    string GetMessage(string messageId);
    [WebInvoke(Method = "POST", UriTemplate = "messages")]
    [OperationContract]
    string InsertMessage(string message);
}

以下是好的建议:

REST最佳实践

RESTful API设计

是的,这是可能的,但需要一些更改。您只需要更改方法的名称,但可以对这两个端点使用相同的url。例如,你可以这样做:

[OperationContract]
[WebGet(UriTemplate = "GetData/{value}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Xml)]
        string GetData2(string value);
[OperationContract]
[WebInvoke(UriTemplate = "GetData/{value}", RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Xml)]
        string GetData(string value);

第一个只能通过GET请求访问,第二个只能通过POST方法访问。

或者我们可以为重载方法使用别名。在这种情况下,我们可以使用以下别名(而不是原始名称)访问此操作:

[ServiceContract]
interface IMyCalculator
{
    //Providing alias AddInt, to avoid naming conflict at Service Reference
    [OperationContract(Name = "AddInt")]
    public int Add(int numOne, int numTwo);
    //Providing alias AddDobule, to avoid naming conflict at Service Reference
    [OperationContract(Name = "AddDouble")]
    public double Add(int numOne, double numTwo); 
}

在上面的例子中,这些方法可以通过使用它们的别名在客户端访问;它们是AddInt和AddDouble。