2014-12-31 1 views
4

This вопрос уже спрашивает, о чем я прошу, но я хочу получить некоторые пояснения в ответе.Является ли WebGet функционально эквивалентным WebInvoke (Method = "GET")?

В ответе утверждается, что WebGet и WebInvoke аналогичны, и что основное различие - это параметр Method.

Но если параметр Method установлен в "GET", на самом деле он функционально эквивалентен или существуют другие отличия?

+1

Документация для [WebInvoke] (http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webinvokeattribute (v = против .110) .aspx) говорит: «Если вы хотите, чтобы операция службы отвечала на GET, вместо этого используйте WebGetAttribute». Таким образом, кажется, что WebInvoke предназначен только для использования с POST, PUT или DELETE. –

+0

Одно отличие: Внутренний [System.Data.Services.Providers.BaseServiceProvider.AddOperationsFromType] (http://referencesource.microsoft.com/#System.Data.Services/System/Data/Services/Providers/BaseServiceProvider.cs,d5f831be05db2b2a , ссылки) метод рассматривает WebGet как GET и WebInvoke (даже если его метод GET) как POST. –

+0

@MichaelLiu Да, я читал это, но код уже содержит 'WebInvoke (Method =" GET ")', поэтому я хочу убедиться, что я ничего не нарушаю, прежде чем я изменю –

ответ

2

Это просто атрибуты маркера и на 100% функционально эквивалентны. Единственное, что интерпретирует эти атрибуты является WebHttpBehavior::GetWebMethod метод и его функциональность просто:

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"; 
} 
0

Это не так.

Я только что провел несколько часов, пытаясь заменить WCF DataContractJsonSerializer с Newtonsoft JsonSerializer использования MessageFormatter на основе this и this образцов

обнаруженных (жесткий путем) Существует разница в использовании WebGet и WebInvoke(Method="GET").

С WebInvoke Этим запросом проходит через различный трубопровод в стеке WCF, пытаясь десериализациями ожидаемого сообщения (метод IDispatchMessageFormatter.DeserializeRequest() получает вызывается), который не так с WebGet.

Извлеченный урок: использовать WebGet для GET работы