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服务吗?
是的,这是可能的,龙舌兰的答案非常接近预期:
[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。