2014-12-31 7 views
4

This 질문은 이미 내가 묻는 것을 묻습니다.하지만 대답에 대한 설명이 필요합니다.WebGet은 WebInvoke (Method = "GET")와 기능적으로 동일합니까?

대답은 WebGetWebInvoke이 비슷하며 주된 차이는 Method이라는 것을 나타냅니다.

그러나 Method 매개 변수를 "GET"으로 설정하면 기능적으로 동일한 지 아니면 다른 차이점이 있습니까?

+1

[WebInvoke의]에 대한 문서를 WebGet을 사용 (http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webinvokeattribute (V = VS .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 , references) 메서드는 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

그것은 아니다.

난 그냥 Newtonsoft JsonSerializer이 WebGetWebInvoke(Method="GET") 사용에 차이가 발견 thisthis 샘플

(어려운 방법)에 따라 MessageFormatter를 사용하여 WCF DataContractJsonSerializer를 교체하려고 몇 시간을 보냈다.

WebInvoke으로 요청은 WebGet의 경우와 다른 예상 된 메시지 (방법 IDispatchMessageFormatter.DeserializeRequest()이 호출 됨)를 비 직렬화하려는 WCF 스택의 다른 파이프 라인을 통과합니다.

교훈 습득 : GET 동작