Is WebGet functionally equivalent to WebInvoke(Method = "GET")?
Asked Answered
P

2

4

This question already asks what I'm asking, but I want some clarification on the answer.

The answer states that WebGet and WebInvoke are similar, and that the primary difference is the Method parameter.

But if the Method parameter is set to "GET", is it actually functionally equivalent, or are there other differences?

Polky answered 31/12, 2014 at 16:17 Comment(3)
The documentation for WebInvoke says: "If you want a service operation to respond to GET, use the WebGetAttribute instead." So it seems that WebInvoke is only intended to be used with POST, PUT, or DELETE.Wether
One difference: The internal System.Data.Services.Providers.BaseServiceProvider.AddOperationsFromType method treats WebGet as GET and WebInvoke (even if its Method is GET) as POST.Wether
@MichaelLiu Yeah, I read that, but the code already contains WebInvoke(Method="GET"), so I want to make sure I'm not breaking anything before I changePolky
V
2

They are simply marker attributes and end up being 100% functionally equivalent. The only thing that interprets these attributes is the WebHttpBehavior::GetWebMethod method and its functionality is simply:

internal static string GetWebMethod(OperationDescription od)
{
    WebGetAttribute webGetAttribute = od.Behaviors.Find<WebGetAttribute>();
    WebInvokeAttribute webInvokeAttribute = od.Behaviors.Find<WebInvokeAttribute>();
    WebHttpBehavior.EnsureOk(webGetAttribute, webInvokeAttribute, od);
    if (webGetAttribute != null)
    {
        return "GET";
    }
    if (webInvokeAttribute == null)
    {
        return "POST";
    }
    return webInvokeAttribute.Method ?? "POST";
}
Visitor answered 31/12, 2014 at 17:55 Comment(0)
T
0

It is not.

I just spent few hours trying to replace WCF DataContractJsonSerializer with Newtonsoft JsonSerializer using MessageFormatter based on this and this samples

found out (the hard way) there IS difference in using WebGet and WebInvoke(Method="GET").

With WebInvoke the request goes through different pipeline in WCF stack, trying to deserialize the expected message (method IDispatchMessageFormatter.DeserializeRequest() gets invoked) which is not the case with WebGet.

The lesson learned: use WebGet for GET operation

Third answered 29/3, 2017 at 16:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.